实现Selection sort选择排序算法部分测试用例运行错误如何解决
问题根因
你的选择排序实现的核心错误是交换操作的执行时机不对:exch(a,i,min)被写在了内层遍历循环的内部,每对比一个元素就会执行一次交换,完全不符合选择排序的设计逻辑。
选择排序的正确逻辑是:对每一位位置i,先完整遍历i之后的所有剩余元素,找到剩余元素里最小的那个的下标min,全程仅做下标更新,等遍历完所有剩余元素找到真正的最小值位置后,仅执行一次交换把最小值放到i的位置即可。
修正后的代码
你只需要把exch(a,i,min)移出内层循环即可,完整的sort方法如下:
public static void sort(Comparable[] a) { int N = a.length; for(int i = 0; i < N; i++) { int min = i; // 内层循环仅更新最小值下标,不交换 for(int j = i + 1; j < N; j++) { if(less(a[j], a[min])) min = j; } // 找到当前区间最小值后,仅交换一次 exch(a, i, min); } }
验证结果
修正后两个测试用例都可以得到正确的升序排序结果:
- 用例1
{100,90,6,43,12,1}排序结果为{1,6,12,43,90,100} - 用例2
{100,90,6,43,12,7}排序结果为{6,7,12,43,90,100}
内容的提问来源于stack exchange,提问作者Kumar_Maddy
相关产品推荐
相关产品推荐

