给出冒泡排序的以下程序(伪代码),我正在尝试计算Ω符号。
procedure BUBBLE_SORT(A,n) {
array A(1 to n)
for (int i = 1; i <= n; i++) {
for(int j = 1; j <= n-1; j++) {
if(A[j] > A[j+1] {
//swap(A(j), A(j+1))
}
}
}
}
for(int i = 1; i&lt; = n; i ++)|| C1 = n + 1(因为它仍然检查它何时为假)
for(int j = 1; j&lt; = n-1; j ++)|| C2 =(n)(n + 1)(因为它是嵌套的,所以你加倍n + 1)
if(A [j]> A [j + 1])|| C3 = 1
这会给我:
C1(n + 1)+ C2(n ^ 2 + n)+ C3
这不等于Ω(n ^ 2)吗?但我知道对于冒泡排序,它应该是Ω(n)(如果列表已经排序)。
我的计算有什么问题?
谢谢!
答案 0 :(得分:2)
它在Ω(n)中,因为最好的情况是元素已经排序,其中Ω(n)表示复杂性的下限。
void bubbleSort(int arr[], int n)
{
int i, j;
bool swapped;
for (i = 0; i < n-1; i++)
{
swapped = false;
for (j = 0; j < n-i-1; j++)
{
if (arr[j] > arr[j+1])
{
swap(&arr[j], &arr[j+1]);
swapped = true;
}
}
// IF no two elements were swapped by inner loop, then break
if (swapped == false)
break;
}
}
如果我们使用上面的代码,我们可以看到我们可以检查交换是否发生,如果没有发生交换,这意味着它已经被排序,因此我们可以在1次迭代中打破循环