这种气泡排序衍生物的相对运行时间是多少?

时间:2014-06-28 22:14:01

标签: sorting bubble-sort

public class Sort {
    public static void sort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                /* swap */
                int temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
                /* make i == -1 because at the end of the loop, it increments to go to 0 */
                i = -1;
            }
        }
    }
}

这与传统的冒泡排序不同。但它的运行时间是否更差?

我相信这仍然是O(N ^ 2),所以我看不出它有多糟糕......

2 个答案:

答案 0 :(得分:2)

有趣的野兽。

让我们采取最坏的情况,一个反排序的输入:

9 8 7 6 5 4 3 2 1

将9从第一个位置移动到最后一个位置需要多少次比较?
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 =(n-1)*(n-2)/ 2

如何将8发送到倒数第二位? 1 + 2 + 3 + 4 + 5 + 6 + 7 =(n-2)*(n-3)/ 2

因此,在执行比较时,您的算法实际上是立方

然而,隧道尽头还有一盏灯:
它仍然只是执行掉期数量的二次方,如标准的冒泡排序。

答案 1 :(得分:1)

这绝对是bubblesort的一个实现,虽然它不是传统的算法。你没错,算法在O(n ^ 2)。

虽然这种算法和传统算法在渐近复杂度方面是相同的,但真实机器上的运行时间可能不同。请记住,当我们考虑O(无论如何)复杂性时,会忽略常数因子。所以

O(3 n^2) = O(n^2)

请记住,O(无论如何)是功能集

考虑传统的bubblesort:在这里通过不断增加数组索引来遍历整个数组。在这个算法中你做了一些实际上不需要的比较(因为你知道当你增加外部for循环的循环变量时(在传统的bubblesort中你有2个for循环),你知道左边的所有东西都已经排序了。所以你不必再次循环它。

在实践中,这可能没有什么区别,因为算法将需要这么多时间,以至于在该效果发生之前你会厌倦它。