使用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;
}
答案 0 :(得分:6)
观看下面的gif,注意8最后是如何在最右边,然后被黑匣子包围,表示它不再需要移动,因此不需要检查不再(它大于长度-i-1)。
未检查这些已经锁定在&#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位置。因此,两个最大的元素已经排序,我们不必在下一轮考虑它们。
使用简单的示例尝试您的算法,并手动逐步完成。然后你应该清楚地看到它。