首页 > 解决方案 > 为什么在循环中使用变量和直接调用索引有区别?

问题描述

我正在研究插入排序,我注意到我的代码仅在我使用变量 (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 ]

标签: javascriptsorting

解决方案


给定这个简单的数组,假设我们使用的是非工作算法:

 //    i
   [2, 3, 1]
 // j

您将使用i = 1and开始插入排序num = 3array[i]也是3在开始。现在 as array[j] (2)is small 3,我们将在下一个索引处继续排序。

 //       i
   [2, 3, 1]
 //    j

现在i = 2num1array[i]也是1(还)。越小,array[i] (1)发生array[j] (3)右移:

 //       i
 //     >>>
   [2, 3, 3]
 //    j

循环现在应该继续,j = 0因为1必须在2and之前插入3,如果我们可以比较num (1)内部array[j] (2)循环将继续,但是当你采取array[i] (3)时,循环停止:

  //       i
    [2, 3, 3]
 //  j

比插入发生在错误的位置:

 //    v
   [2, 1, 3]

推荐阅读