选择排序(最大值移至右侧)未完全排序问题排查
问题分析与修复
你的代码存在两个核心问题,导致前两个元素排序错误:
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
相关产品推荐
相关产品推荐

