传统的冒泡排序,时间复杂度会是O(n*n),以下的改进型冒泡排序,加入一个标志位,巧妙的利用上一次比较信息决定是否有必要进行下一次的排序;能将时间复杂度降到O(n*logn)。
#include <stdio.h>
void optim_bub(int a[], int num)
{
int i,j,temp;
int changed;
int count = 0;
for(i = num; i > 1; i--)
{
changed = 0;
for(j = 0; j < i-1; j++)
{
printf("i = %d, j = %d\n",i,j);
count ++;
if(a[j] > a[j+1])
{
changed = 1;
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
//如果临近两两比较都不必交换,那也就没有进行下一次排序的必要了。
if(0 == changed) break;
}
for(i = 0; i < num; i++)
{
printf("%d ", a[i]);
}
printf("\n");
printf("O(n) = O(%d)\n",count);
}
int main(void)
{
int a[] = {5,8,2,1,3,4,9,7,10,6};
//int a[] = {1,2,3,4,5,6,7,8,9,10};
optim_bub(a,10);
system("pause");
return 0;
}