比较这三个数的大小,按由大到小的顺序输出 的代码记录

本文介绍了一种通过比较找出三个不同数值中最大值、中间值和最小值的算法实现过程。算法采用逐步筛选的方式确定每个数值的位置,并通过一系列条件判断实现了数值的正确排序。

比较这三个数的大小,按由大到小的顺序输出
首先应当考虑的是3个数值相同情况 和3个数值中有两个相同的情况,下文的说法建立在3个数值已经被判定不同的情况下。
我的想法首先是找出最大的一个数,再依次通过条件判断找出中间值,最小值。
因为要比较的是3个数,所以肯定只是得有3个变量来存放,在比较过程中切换存放这3个值的变量会造成不必要的麻烦,所以定义4个变量,前3个存放3个需要比较的数值,第4个用来做存放比较结果的容器

if (a>b){
   d=a;
  }else{
   d=b;
  }
  if(d<c){
   d=c;
  }
  System.out.println(d);

d用来存放比较结果可以先定义不赋值。
比较时可以先进行a,b的比较,筛选出较大值,再把该
值存入变量d,再把d与c拿来比较,较大值存入d,这样
可以得到最大值d

if (a>b){
   d=a;
  }else{
   d=b;
  }
  if(d<c){
   d=c;
  }
  System.out.println(d);

此时d即为最大值,由于下一个需要输出的是中间值,所以下面开始找中间值,要取中间值,可以通过已有的最大值来进行判断,第一步判断最大值是a,b,c中的哪一个,再在其中再加一重判断,判断剩余两个值,哪一个较大,把它赋给容器d,得出中间值d


if (d<=c){
   if (a>b){
    d=a;
   }else{
    d=b;
   }
  }else if (d<=b){
   if (a>c){
    d=a;
   }else{
    d=c;
   }
  }else if (d<=a){
   if (b>c){
    d=b;
   }else{
    d=c;
   }
  }else{
   System.out.println("出现错误 ");
  }
  System.out.println(d);
  此时输出d,d即为中间值,接下来寻找最小值,此时容器d中存在的是中间值,那么只要找到比d小的值,
    那么此值就是最小值

if (a<d){
d=a;
}else{
if (b<d){
d=b;
}else{
if (c<d){
d=c;
}else{
System.out.println(“出现错误”);
}
}
}
System.out.println(d);

再把最后这个存放最小值的d输出就完成了比较

<think>好的,用户让我帮忙写一个用指针方法对10个整数进行由到小排序的程序,要求使用选择排序法。首先,我需要回忆一下选择排序的基本原理。选择排序的核心是每次从待排序的数据中选出最(或最小)的元素,存放到序列的起始位置,直到全部待排序的数据排完。 接下来,用户要求使用指针方法,这意味着在程序中要避免使用数组下标,而是通过指针来操作数组元素。我需要考虑如何用指针来实现选择排序中的元素比较和交换步骤。 首先,主函数部分。用户需要输入10个整数,所以应该先定义一个长度为10的数组,然后用指针遍历数组进行输入。例如,使用一个指针p从数组首地址开始,移动到末尾,每次循环读取输入的值存储到指针指向的位置。 然后是排序函数的设计。选择排序需要两层循环,外层循环控制当前需要填充的位置,内层循环找到从当前位置到末尾的最元素。这里需要用指针来表示当前的位置和遍历的指针。比如,外层循环的指针start指向当前需要填充的位置,内层循环的指针current从start开始遍历到数组末尾,找到最的元素的位置max_ptr。 找到最元素后,将max_ptr指向的值与start指向的值进行交换。这里需要注意,交换的是指针所指向的值,而不是指针本身。所以需要一个临时变量temp来辅助交换。 在实现过程中,要确保指针的移动和比较正确。例如,内层循环中,current指针从start+1开始,直到数组末尾,比较每个元素与当前max_ptr指向的值的大小,如果更,则更新max_ptr。 另外,用户要求按由到小排序,所以在比较时应该寻找最的元素,并放到前面。这一点要确认是否正确,避免出现升序排序的错误。 测试部分,需要确保程序能够正确处理各种情况,比如重复元素、已经排序好的数组等。例如,输入10个数字后,程序应该正确输出到小的顺序。 可能遇到的问题包括指针越界、未正确初始化指针、或者在交换元素时出错。比如,在计算数组末尾的位置时,要注意数组索引是从0开始的,所以末尾的指针应该是a + 9,而不是a + 10。 最后,代码的可读性也很重要。适当添加注释,说明指针的作用和循环的目的,这样用户更容易理解代码的逻辑。例如,在排序函数中注释外层循环和内层循环的作用,以及交换的步骤。 总结一下,步骤致如下: 1. 输入10个整数到数组中,使用指针遍历输入。 2. 实现选择排序函数,使用指针找到每轮的最元素,并与当前位置交换。 3. 输出排序后的数组,同样使用指针遍历输出。 需要确保所有指针操作正确,避免越界和逻辑错误。测试不同的输入情况,验证程序的正确性。</think>### C语言实现指针版选择排序(从到小) --- #### 核心思路 1. **选择排序原理**:每轮选出未排序部分的最值,与当前待排序位置交换。 2. **指针操作**:用指针遍历数组,直接操作内存地址。 3. **双重循环结构**:外层定位待排序位置,内层查找最值。 --- ### 完整代码实现 ```c #include <stdio.h> // 函数声明:指针版选择排序 void select_sort(int *a, int n); int main() { int a[10]; // 固定处理10个整数 printf("请输入10个整数: "); for (int *p = a; p < a + 10; p++) { // 指针遍历输入 scanf("%d", p); } select_sort(a, 10); // 传递数组首地址 printf("从到小排序结果: "); for (int *p = a; p < a + 10; p++) { // 指针遍历输出 printf("%d ", *p); } return 0; } // 选择排序函数实现 void select_sort(int *a, int n) { int *start, *current, *max_ptr; for (start = a; start < a + n - 1; start++) { // 外层循环定位待排序位置 max_ptr = start; // 初始化最值指针 // 内层循环查找最值 for (current = start + 1; current < a + n; current++) { if (*current > *max_ptr) { // 发现更的值 max_ptr = current; // 更新最值指针 } } // 交换最值与当前位置 if (max_ptr != start) { // 避免无意义交换 int temp = *start; // 经典变量交换 *start = *max_ptr; *max_ptr = temp; } } } ``` --- ### 代码解析 1. **输入输出优化** - 使用指针替代数组索引,直接操作内存地址: ```c for (int *p = a; p < a + 10; p++) { scanf("%d", p); // p即当前元素地址 } ``` 2. **选择排序核心逻辑** - **双指针定位**:`start`标记当前待排序位置,`max_ptr`追踪最值位置。 - **内存遍历查找**:内层循环通过`current`指针扫描未排序区域: ```c for (current = start + 1; current < a + n; current++) { if (*current > *max_ptr) { // 比较指针指向的值 max_ptr = current; // 更新最值地址 } } ``` 3. **高效交换机制** - 仅当`max_ptr != start`时才执行交换,减少冗余操作: ```c if (max_ptr != start) { int temp = *start; // 通过指针解引用交换值 *start = *max_ptr; *max_ptr = temp; } ``` --- ### 示例运行 **输入**: ``` 请输入10个整数: 3 7 2 9 1 4 8 6 5 0 ``` **输出**: ``` 从到小排序结果: 9 8 7 6 5 4 3 2 1 0 ``` **内存操作过程**: ``` 初始数组: [3][7][2][9][1][4][8][6][5][0] ↑ start (第一轮找到最值9) 第1轮交换后: [9][7][2][3][1][4][8][6][5][0] ↑ start (第二轮从第二个元素开始找最值8) 最终完成所有交换后得到有序数组 ``` --- ### 关键点详解 1. **指针运算本质** - `a + n` 表示数组第n个元素的地址(等价`&a[n]`)。 - `current = start + 1` 使得指针跳过已排序部分。 2. **时间复杂度分析** - 比较次数:$\sum_{i=0}^{n-1} (n-i-1) = \frac{n(n-1)}{2}$ - 时间复杂度:$O(n^2)$(标准选择排序特性) 3. **空间复杂度优势** - 仅使用固定数量的指针变量,空间复杂度为 $O(1)$。 --- ### 改进方案 1. **泛型版本** 使用`void*`和函数指针实现通用排序: ```c void generic_sort(void *base, size_t nmemb, size_t size, int (*compare)(const void*, const void*)) { char *array = base; for (int i = 0; i < nmemb-1; i++) { char *max = array + i*size; for (int j = i+1; j < nmemb; j++) { char *current = array + j*size; if (compare(current, max) > 0) { // 使用自定义比较函数 max = current; } } swap(max, array+i*size, size); // 字节级交换 } } ``` 2. **稳定性增强** 记录值出现位置,确保相同元素的原始顺序: ```c if (*current == *max_ptr) { // 记录更早出现的位置 if (current < max_ptr) max_ptr = current; } ``` 3. **性能优化** 同时追踪最值和最小值,减少循环次数: ```c void double_selection_sort(int *a, int n) { int *left = a, *right = a + n - 1; while (left < right) { // 同时查找最值和最小值 } } ``` --- ### 常见问题解答 **Q1: 为什么用指针而不用数组下标?** A1: 指针操作更接近底层内存,执行效率略高(编译器优化后差异微小),主要锻炼指针运用能力。 **Q2: 如何处理n个元素而非固定10个?** A2: 修改`main()`函数中的数组声明为动态分配: ```c int *a = malloc(n * sizeof(int)); // 需包含<stdlib.h> ``` **Q3: 如何改为从小到排序?** A3: 修改比较条件: ```c if (*current < *max_ptr) { // 改为寻找更小的值 max_ptr = current; } ``` --- 通过上述代码和解析,可以深入理解指针在选择排序中的应用,掌握直接操作内存进行排序的核心技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值