我只是在学习排序(不是第一次)。在冒泡排序中,我们将以下代码作为代码。
int bubble_sort(int *arr, size_t n) {
size_t i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return 0;
}
正如你们所看到的,内部循环有n-1
次(在for循环中),这是可以理解的(a[i],a[i-1]
都参与一次迭代),但外部循环有{{1 }},但它也适用于i < n
。但是大多数互联网实现都有i < n-1
作为外循环值。执行外循环n
适用于最差情况n-1
。只是想知道,如果有任何一组输入不能用于5 4 3 2 1
次外循环。如果有请发布并解释。感谢。
答案 0 :(得分:3)
N-1也很好。如您所述,最坏的情况需要N-1交换(因为最后一个必须成为第一个,反之亦然)。如果将i变量的打印添加到if语句的内部,您将看到它在最后一次迭代中从未被调用过。这意味着循环的最后一次迭代永远不会导致任何交换。
尽管如此,Bubblesort的更高效实现并不使用for循环作为外循环。看看下面的代码。你能看到执行差异吗?
int bubble_sort(int *arr, size_t n) {
size_t i,j;
int flag = 1;
while (flag) {
flag = 0;
for(j=0;j<n-1;j++) {
if(arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = 1;
}
}
}
return 0;
}
通过仅在实际交换发生时设置标记,当你处于平均情况时,你最终会很快跳出循环。
答案 1 :(得分:1)
不,没有这样的输入。
理性是在Bubble-sort的证明。回想一下,当证明在冒泡排序的i
'(外部)迭代中时,i
最后一个元素已到位并已排序。
因此,在n-1
迭代之后,最后n-1
元素到位并排序,只留下剩余的第一个元素 - 只能在其正确的位置,数组中的第一个位置
(所以,使用这种方法,我们可以证明,冒泡排序最多需要n-1
次迭代)
另请注意:经典冒泡排序在内循环中只需要n-i
次迭代(因为我上面提到的理性),而不是n-1
。