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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:30:09