删除最小值实现的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
相关产品推荐
相关产品推荐

