Cos*_*Cat 3 java time time-complexity
给定一个冒泡排序算法
for (int i = 0; i < A.length - 1; i++)
for (int j = 0; j < A.length - i - 1; j++)
if (A[j] > A[j + 1]) {
int temp = A[j];
A[j] = A[j + 1];
A[j + 1] = temp;
}
Run Code Online (Sandbox Code Playgroud)
如果给定的数组已经排序,则内部循环中的 if 语句将始终为 false,从而破坏内部 for 循环并递增j直到A.length-i-1到达。当A.length-i-1达到时,i增加。这个过程循环进行,直到i达到A.length-1。
我的困惑:
如果两个嵌套循环都迭代到各自的上限,尽管没有进行交换,但最佳情况下时间复杂度不是仍然是O(n^2)吗?谁能简单地向我解释一下为什么它会是O(n)
如果程序原样,是的,在最好的情况下它仍然需要 O(n^2) 。但你可以增强这个程序。
在第一次通过时,您将看到没有发生任何交换。您可以保留一个标志来检查如果在一次传递期间没有发生交换,则您不需要进一步传递。
在这种情况下,您只需执行一次,时间复杂度将为 O(n)
示例程序(结构可以更好):
boolean previousIterationSwap = false;
final int[] A = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (int i = 0; i < A.length - 1; i++) {
// After the first iteration check if previous iteration had any
// swap
if (i > 0 && !previousIterationSwap) {
break;
}
for (int j = 0; j < A.length - i - 1; j++) {
if (A[j] > A[j + 1]) {
previousIterationSwap = true;
final int temp = A[j];
A[j] = A[j + 1];
A[j + 1] = temp;
} else {
previousIterationSwap = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)