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

删除最小值实现的JS代码是否属于selection sort(选择排序)?

结论

你写的这段代码属于选择排序的非原地实现变体,符合选择排序的核心设计思想。

判断依据

选择排序的核心逻辑是:每一轮从待排序区间中选出最小/最大值,将其移动到已排序区间的末尾,重复操作直到所有元素排序完成。你的实现完全贴合这个逻辑:

  • 待排序区间:每次循环时未处理完的list数组
  • 已排序区间:用来存放结果的result数组
  • 每轮操作:找出list中的最小值,追加到result末尾,再从list中删除该最小值,完成一轮极值的选择与转移

它和我们更常见的「原地交换版选择排序」的唯一区别是存储结构的选择:

原地交换版会把原数组切分为前半段已排序区间、后半段待排序区间,每轮找到后半段的最小值后,和后半段的第一个元素交换位置,实现极值转移,不需要额外开辟新数组存储结果,空间复杂度为O(1);而你的实现需要额外的数组存储结果,空间复杂度为O(n),但核心排序逻辑没有本质区别。

代码存在的问题

你当前的代码循环条件有逻辑错误,无法完成全量排序:
你用for (let i = 0; i < list.length; i++)作为循环条件,但是每次循环都会通过splice把list的长度减1,而i是持续递增的,会导致循环提前终止。比如输入长度为5的数组,只会执行3次循环就停止,最终返回的result只有3个元素。

修正后的代码可以把循环改成while判断,同时为了避免修改传入的原数组,建议先对输入做一次浅拷贝:

// 修正版实现
selectionSortNoSwap = list => {
  const result = [];
  const copyList = [...list];
  while (copyList.length > 0) {
    const min = Math.min(...copyList);
    const minIndex = copyList.indexOf(min);
    result.push(min);
    copyList.splice(minIndex, 1);
  }
  return result;
};

selectionSortNoSwap([3, 5, 2, 1, 4]); // 输出 [1,2,3,4,5]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:15:00