javascript - 插入排序循环不变量
问题描述
function insertionSort(arr) {
var length = arr.length,
val,
i,
j;
for(i = 0; i < length; i++) {
value = arr[i];
for(j = i - 1; j > -1 && arr[j] > value; j--) {
arr[j+1] = arr[j]
}
arr[j+1] = value;
}
return arr;
}
控制台日志(插入排序([6,1,23,4,2,3]))
我正在查看一个用 javascript 编码的插入排序算法的示例,并且无法理解为什么它会通过内部 for 循环的条件。需要明确的是,这个算法是正确的——我只是很难理解为什么。
如果 j 用 i - 1 初始化,那么 j 的值为 -1,因为 i 被初始化为 0。在条件的第一部分,它声明 j > -1,这意味着它不会通过这个测试,因为 j 不大于 -1。
有人能告诉我我错过了什么吗?
解决方案
你是对的,第一次迭代不会进入第二次循环,但这没关系。注意那个循环在做什么。array[j+1]
它正在与交换array[j]
。什么时候i == 0
,那么j == -1
。您不能array[0]
与交换array[-1]
,因为它不存在。这是绕过该问题的巧妙方法。
但是,这只发生在第一次迭代中。随后的迭代将按预期进入循环。
推荐阅读
- javascript - 如何使用来自 JSON 的数据修改 div
- reactjs - 无法到达变量
- c++ - C++ 调试断言失败;表达式:列表迭代器不兼容
- python - 如何将csv转换为线路协议
- vue.js - VueJS 中的 props 相互依赖
- python - 有没有办法在我的 tkinter 应用程序中添加一个工作滚动条而不将它链接到列表框中?
- firebase - 在颤动中按下注销按钮后如何重定向到登录页面
- vba - 使用 VBA 将多个 TXT 导入最后一列时访问添加文件名
- asp.net-core-webapi - 尝试从 FileStreamResult 下载的 Blazor 错误
- oracle - 每次为用户分配一个唯一值