javascript - 为什么不能在内部循环中使用 if 语句而不是 && 在插入排序中?
问题描述
我想将此代码用于插入排序,但它给出了未排序的输出:
function insertionSort(arr) {
//insert each element in the right place in the sorted section
for (let i=1;i<arr.length;i++) {
var currentValue = arr[i];
for (var j=i-1; j>=0; j--) {
if (arr[j]>currentValue) {
arr[j+1]=arr[j];
}
}
arr[j+1] = currentValue;
}
return arr;
}
正确的代码:
function insertionSort(arr) {
for (let i=1; i<arr.length; i++) {
let currentValue = arr[i];
for (var j=i-1; j>=0&&arr[j]>currentValue; j--) {
arr[j+1]=arr[j];
}
arr[j+1]=currentValue;
}
return arr;
}
我只是无法弄清楚这两个代码中的逻辑差异。
解决方案
在循环中的正确代码j--
中for()
停止递减。在你的错误循环中j--
继续递减直到j = -1
. 因此,当您这样做时:
arr[j+1] = currentValue;
在正确的代码中,它将是条件不再为真j
时的最后一个值。if
在您的代码中,它将始终是:
arr[0] = currentValue;
因为 的值j
总是-1
。
您可以使用以下方法修复它break
:
if (arr[j]>currentValue) {
arr[j+1]=arr[j];
}
else {
break;
}
推荐阅读
- excel - 根据 Power BI/Power Query 中的特定条件计数属性
- java - HashSet::add 用法不会导致“无法从静态上下文引用非静态方法”
- android - Android 库中的 SDL2
- java - 为什么以这种方式使用 .clone() 仍然获得与原始对象相同的地址?
- python - pandas - 比较 N 列并输出最大值(相等的列)
- c++ - 如何在不知道将创建多少对象的情况下初始化对象指针向量?
- python - 使用旧电子邮件更新电子邮件时,UniqueValidator 抛出错误
- docker - 通过 terraform 获取 GCR 图像摘要的最简单方法是什么?
- html - 我应该如何在 TwinCAT HMI 中使用图标字体?
- powershell - 我想用 ftp 创建一个持久的映射网络驱动器