我正在研究插入排序,我注意到我的代码只有在我使用变量 (num) 与 myArray[j]
的值进行比较时才有效。
我很困惑为什么 myarray[i] 不起作用,因为 num 被设置为 myarray[i] 的值并且因为 myarray[j] 嵌套在循环内部,所以 i 的值不会改变。那么为什么只有当我使用 (num) 作为比较时该方法才能正常工作?
const myArray = [3,1,4,8,2,7,3,23,43,21,46,23,30,49,50,12,44,233,492,32];
const insertionSort = (myArray) => {
for (let i = 1;i<myArray.length;i++){
let num = myArray[i];
j = i-1
while (j>=0 && myArray[j]>num){
myArray[j+1] = myArray[j]
j--
}
myArray[j+1] = num
}
}
// correctly outputs [ 1, 2, 3, 3, 4, 7, 8, 12, 21, 23, 23, 30, 32, 43, 44, 46, 49, 50, 233, 492 ]
const insertionSort = (myArray) => {
for (let i = 1;i<myArray.length;i++){
let num = myArray[i];
j = i-1
while (j>=0 && myArray[j]>myArray[i]){
myArray[j+1] = myArray[j]
j--
}
myArray[j+1] = num
}
}
// incorrectly outputs [ 1, 3, 4, 2, 7, 3, 8, 23, 21, 43, 23, 30, 46, 49, 12, 44, 50, 233, 32, 492 ]
最佳答案
给定这个简单的数组,假设我们使用的是无效算法:
// i
[2, 3, 1]
// j
您将从 i = 1
和 num = 3
开始插入排序。 array[i]
开头也是3
。现在由于array[j] (2)
小于3
,我们将在下一个索引处继续排序。
// i
[2, 3, 1]
// j
现在 i = 2
,num
是 1
而 array[i]
是 1
太(还)。由于 array[i] (1)
较小 array[j] (3)
,右移发生:
// i
// >>>
[2, 3, 3]
// j
循环现在应该继续到 j = 0
,因为必须在 2
和 3
之前插入 1
,如果我们可以将 num (1)
与 array[j] (2)
进行比较,则内部循环将继续,但是当您使用 array[i] ( 3)
,循环停止:
// i
[2, 3, 3]
// j
比插入发生在错误的位置:
// v
[2, 1, 3]
关于javascript - 为什么在循环中使用变量和直接调用索引之间存在差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55683916/