javascript - 为什么在循环中使用变量和直接调用索引之间存在差异?

标签 javascript sorting

我正在研究插入排序,我注意到我的代码只有在我使用变量 (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 = 1num = 3 开始插入排序。 array[i]开头也是3。现在由于array[j] (2)小于3,我们将在下一个索引处继续排序。

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

现在 i = 2num1array[i]1 太(还)。由于 array[i] (1) 较小 array[j] (3),右移发生:

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

循环现在应该继续到 j = 0,因为必须在 23 之前插入 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/

相关文章:

javascript - 渲染部分在控制台中不显示任何错误

mysql - Mysql 中的排名值

c++ - 从非常大的未排序列表中获取最大 X 数的最快方法?

sorting - Elasticsearch - 按缺少参数的多个字段排序

sorting - 在 Haskell 中,如何对无限字符串列表进行排序?

c++ - 可中断排序函数

javascript - 我可以在 Chrome 中使用 javascript 获取剪贴板数据吗

javascript - 如何使用 Angular 从 ListView 模板传递数据以编辑 View 模板

javascript - ObservableArray 在 KnockOut JS 中选择选项

javascript - 在 nginx 后面部署 deepstream.io