【发布时间】:2019-05-25 01:19:17
【问题描述】:
我已经使用具有非重复值的数组测试了我的代码,它似乎工作正常。当我确实有重复时,它不起作用。
这是我目前所拥有的。我认为找到切片数组最小值的代码行给我带来了问题。
function selectionSort(array) {
for (let i = 0; i < array.length; i++) {
let min = Math.min(...array.slice(i));
let indexMin = array.indexOf(min)
array.splice(indexMin, 1)
array.splice(i,0,min);
}
return array;
}
console.log(selectionSort([3, 0, -5, -5]));
使用[3,0,-5,-5]的测试数组,在循环的第一次迭代中,最小值为-5,indexMin为2。拼接数组后,我得到[3, 0,-5]。当我再次拼接它(在数组的开头插入值)时,我得到了预期的 [-5,3,0,-5] 。在第二次迭代中,我希望最小值是索引 3 处的 -5 ......但是当我控制台记录最小值时,它说它是索引 0 处的 -5。我指定我想从中找到最小值(...array.slice(1)),那么为什么在索引 0 处将 min 设置为 -5?
【问题讨论】:
-
"我指定我想从 (...array.slice(1)) 中找到最小值" - 是的,但您还指定了要查找该元素在整个数组中的索引:
array.indexOf(min)(包括已经排序的部分)。 -
indexOf也将fromIndex作为第二个参数 - 试试array.indexOf(min, i) -
你不应该使用
splice,你应该简单地交换两个元素。数组不是列表,splice操作并不便宜(尽管它对复杂性无关紧要,选择排序无论如何都是O(n²))