You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

这段选择排序代码的逻辑错误是什么?运行后数组顺序未改变

选择排序实现错误排查

原设计思路

第一层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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:36:23