外循环N值冒泡排序

时间:2012-10-09 17:33:17

标签: arrays algorithm sorting

我只是在学习排序(不是第一次)。在冒泡排序中,我们将以下代码作为代码。

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次外循环。如果有请发布并解释。感谢。

2 个答案:

答案 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