首页 > 解决方案 > 为什么不能在内部循环中使用 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;
}

我只是无法弄清楚这两个代码中的逻辑差异。

标签: javascriptinsertion-sort

解决方案


在循环中的正确代码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;
}

推荐阅读