我已经使用具有非重复值的数组测试了我的代码,并且看起来工作正常。当我确实有重复时,它不起作用。
这是我到目前为止所拥有的。我认为找到切片数组最小值的代码行给我带来了问题。
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]的情况下,在循环的第一次迭代中,min为-5,indexMin为2。将数组拼接后,得到[3, 0,-5]。当我再次对其进行拼接(将值插入数组的开头)时,我得到的期望值为[-5,3,0,-5]。在第二次迭代中,我希望最小值在索引3处为-5 ...但是当我用console.log记录最小值时,它说它在索引0处为-5。我指定要从中查找最小值(... array.slice(1)),那么为什么将索引0处的min设置为-5?
答案 0 :(得分:2)
问题是,当您有重复的indexOf
时,它会返回第一个索引,而一旦您看到它一次,它就不是您想要的-总是找到第一个索引即使有多个,也会发生。
indexOf()
采用可选的第二个参数来指示从何处开始搜索。您可以传入i
,从正确的位置开始跳过已排序的值。
function selectionSort(array) {
for (let i = 0; i < array.length; i++) {
let min = Math.min(...array.slice(i));
let indexMin = array.indexOf(min, i); // pass in i
[array[indexMin], array[i]] = [array[i], array[indexMin]]
}
return array;
}
console.log(selectionSort([4, 5, 4, 3, 3, 3, 1, 3, 1]))