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

选择排序(最大值移至右侧)未完全排序问题排查

问题分析与修复

你的代码存在两个核心问题,导致前两个元素排序错误:

1. 交换逻辑错误:每次比较后立即交换,违背选择排序核心逻辑

选择排序的核心是先遍历找到当前未排序区间的最大值,再仅执行一次交换,但你的代码在每次j循环的比较后都执行交换操作——这会导致刚找到的最大值位置被频繁替换,打乱后续的比较逻辑,最终出现局部排序错误。

2. 外层循环范围错误:未覆盖所有需要排序的位置

你定义maxIndex = n - 1后,外层循环条件是i < maxIndex-1,这意味着循环只执行到i=4(对应数组第5个元素),最后两个元素的排序逻辑没有被完整处理,同时循环的方向也不符合“将最大值移至右侧”的目标。


修正后的代码

int n = 7;
int list[] = { 9, 2, 99, 4, 1, 12, 7};

// 外层循环:从数组末尾开始,逐步确定每个位置的最大值
for (int end = n - 1; end > 0; end--) {
    int maxNum = 0;
    // 内层循环:遍历未排序区间[0, end],找到最大值的索引
    for (int j = 1; j <= end; j++) {
        if (list[j] > list[maxNum]) {
            maxNum = j;
        }
    }
    // 仅交换一次:将最大值移到当前未排序区间的右侧(end位置)
    int temp = list[end];
    list[end] = list[maxNum];
    list[maxNum] = temp;
}

修正说明

  • 外层循环用end变量标记当前要放置最大值的位置,从数组最后一位往前遍历,确保每个位置都能被处理。
  • 内层循环仅负责找到未排序区间的最大值索引,不进行交换,避免频繁交换打乱数组顺序。
  • 找到最大值后,仅执行一次交换操作,将最大值放到end位置,符合选择排序的高效性(减少交换次数)。

运行修正后的代码,输出结果为:1,2,4,7,9,12,99,完全符合排序要求。

内容的提问来源于stack exchange,提问作者needusername

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:41:13