JavaScript选择排序实现异常求助:输出结果不符合预期
选择排序代码错误排查与修复
你的代码核心问题是只记录了未排序部分的最小值,却没有记录这个最小值在数组中的位置,导致交换操作只把最小值放到了a[i]的位置,但原最小值所在位置的元素没有被替换为原来的a[i],后续循环会重复读取到这个未被更新的最小值,最终出现重复元素。
举个具体例子,测试[3,2,1]时:
- 第一次循环
i=0,cur最终拿到1(数组索引2的值),交换后a[0]变成1,但数组索引2的元素还是1,此时数组变为[1,2,1] - 第二次循环
i=1,cur从a[1]=2开始找,后面只有1,cur变成1,交换后a[1]变成1,数组最终变成[1,1,1]
修复方案:不要直接存最小值,而是记录最小值的索引,最后通过索引交换两个位置的元素。
修正后的代码:
function selectionSort(a) { let temp; for (let i = 0; i < a.length - 1; i++) { // 记录未排序部分的最小值索引,初始为当前i的位置 let minIndex = i; for (let j = i + 1; j < a.length; j++) { if (a[j] < a[minIndex]) { // 更新最小值的索引 minIndex = j; } } // 交换当前i位置和最小值索引位置的元素 if (minIndex !== i) { temp = a[i]; a[i] = a[minIndex]; a[minIndex] = temp; } } return a; } console.log(selectionSort([4,5,1,2,7])); // 输出 [1,2,4,5,7] console.log(selectionSort([3,2,1])); // 输出 [1,2,3]
内容的提问来源于stack exchange,提问作者Linh Chi
相关产品推荐
相关产品推荐

