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),所以我看不出它有多糟糕......
答案 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循环),你知道左边的所有东西都已经排序了。所以你不必再次循环它。
在实践中,这可能没有什么区别,因为算法将需要这么多时间,以至于在该效果发生之前你会厌倦它。