这段选择排序代码的逻辑错误是什么?运行后数组顺序未改变
选择排序实现错误排查
原设计思路
第一层for循环从数组末尾位置起始遍历,将当前索引位置的值与数组a[0, 当前索引]区间内的最大值进行交换,最终完成升序排序。
故障现象
代码运行后输出数组和输入数组完全一致,元素顺序没有任何改动。
问题代码
int selection_sort(int *a, int size) { int i, j, swap; for (i = size - 1; i <= 0; i--) { /*this will find the max between o index to i th index*/ for (j = 0; j <= i; j++) { if (a[i] < a[j]) { swap = a[i]; a[i] = a[j]; a[j] = a[i]; } } } }
具体错误点
- 外层循环条件写反,直接导致排序逻辑完全不执行:外层循环初始值为
i = size - 1(即数组最后一个元素的索引),但循环判断条件写为i <= 0。正常传入长度大于1的数组时,初始i值必然大于0,条件判断直接为假,外层循环体一次都不会运行,这就是数组完全没有变化的核心原因。正确的循环判断条件应该为i > 0,即从末尾向前遍历到索引为1的位置即可终止。 - 交换逻辑写错,就算循环能跑也无法正确交换元素:交换操作的第三步错误使用了已经被覆盖的
a[i]赋值。执行a[i] = a[j]后,a[i]原本的值已经存在swap变量里,此时a[i]等于a[j],再执行a[j] = a[i]相当于把a[j]的值赋给自己,两个位置的元素根本没有完成互换。正确的交换第三步应该是a[j] = swap。 - 实现逻辑不符合选择排序的设计要求:原思路是遍历完整个待排序区间、找到区间最大值后仅做一次交换,但当前代码在内层循环遍历过程中,只要发现比
a[i]大的元素就立刻交换,属于低效的即时交换逻辑,会产生很多不必要的交换操作,和选择排序"先找最值、单次交换"的逻辑不符。标准实现应该在内层循环中专门用变量记录最大值所在的索引,等内层循环遍历完整个0~i区间后,再把最大值索引对应的元素和i位置的元素做一次交换即可。
内容的提问来源于stack exchange,提问作者Shubham Gaikwad
相关产品推荐
相关产品推荐

