为什么我们在冒泡排序算法的内循环中使用`length-i-1`

时间:2018-05-31 19:36:40

标签: javascript algorithm bubble-sort

使用javascript,它被编程为按asc顺序对数组中的元素进行排序。我尽力理解为什么内循环使用length-i-1,但不能。谁能帮助我理解我们为什么要使用它?

function bubbleSort(arr) {

    for(let i=0; i<= arr.length; i++) {
        for(let j=0; j< arr.length-i-1; j++) {
            if(arr[j] > arr[j+1]) {
                let lesser = arr[j+1];
                arr[j+1] = arr[j];
                arr[j] = lesser;
            }
        }
    }

    return arr;
}

3 个答案:

答案 0 :(得分:6)

像丹尼尔在他的评论中所说,这是因为那些项目已经被排序(例如,最大元素在第一次迭代中最高的指数)

观看下面的gif,注意8最后是如何在最右边,然后被黑匣子包围,表示它不再需要移动,因此不需要检查不再(它大于长度-i-1)。

Bubble Sort in action

未检查这些已经锁定在&#39;元素有助于提高算法速度。

Gif来自:Bubble Sort on Wikipedia

答案 1 :(得分:1)

让我们从步骤来考虑它: 假设你有一个包含10个元素的数组,仅仅是为了举个例子。

第一步

i = 0, j goes from 0 to 9( = 10 - 0 - 1)

所以它遍历整个数组。 现在,每当我们有当前元素大于下一个元素时,我们就会切换它们(if(arr[j] > arr[j+1])),所以在第一次迭代结束时,在最后一个位置,我们将得到最大元素阵列。

第二步

i = 1, j goes from 0 to 8( = 10 - 1 - 1)

现在,我们可以注意到我们遗漏了最后一个(第9个)位置,但我们知道它已经是上一步的最大值,所以它处于正确的位置。在此迭代结束时,我们将在第8个位置上具有第二个最大元素,并且该过程继续...

答案 2 :(得分:1)

编辑:电话太慢:P

每次外部迭代后,第i个最大元素位于正确的位置。因此,在第一次迭代之后,最伟大的元素位于最右侧。现在我们知道了,我们不必在下一轮比较这个元素。 在第二次迭代之后,第二大元素位于最右侧-1位置。因此,两个最大的元素已经排序,我们不必在下一轮考虑它们。

使用简单的示例尝试您的算法,并手动逐步完成。然后你应该清楚地看到它。