javascript - 为什么在循环中使用变量和直接调用索引有区别?
问题描述
我正在研究插入排序,我注意到我的代码仅在我使用变量 (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
and开始插入排序num = 3
。array[i]
也是3
在开始。现在 as array[j] (2)
is small 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
因为1
必须在2
and之前插入3
,如果我们可以比较num (1)
内部array[j] (2)
循环将继续,但是当你采取array[i] (3)
时,循环停止:
// i
[2, 3, 3]
// j
比插入发生在错误的位置:
// v
[2, 1, 3]
推荐阅读
- ios - 如何将数据从一个视图控制器传递到另一个在 json 中获取并需要在 tableview 中设置的视图控制器?
- r - 在R中循环,提取输出的最后一行
- https - 使用 netfilter 队列绕过基于 SNI 的 HTTPS 过滤
- c# - 使用 XmlSerializer 以可扩展的方式对任意元素进行反序列化
- c# - 如何使用 Csharp.HttpClient 登录网站
- sql-server - 表的 SQL Server 外键问题
- c++ - AES128 加密 libgcrypt 输出垃圾
- java - 如何仅使用 Reflections 扫描一门课程
- html - 添加标志图像以选择选项
- java - 如何删除 sonarqube equals 和 hashcode 重复代码验证?