一、冒泡排序
1、原理:两两比较,将较大或者较小的数据上浮,实现升序或者降序。
2、实现代码
1 #include<stdio.h> 2 #define Up 1 3 #define Down 0 4 #define DIM(a) (sizeof(a)/sizeof(*a)) 5 void Sort(int* p, unsigned int Array_Long, int Up_Or_Down) 6 { 7 int i,j; 8 int temp; 9 for(i=0;i<Array_Long-1;i++) 10 { 11 for(j=0;j<Array_Long-i-1;j++) 12 if(Up_Or_Down==Up) 13 { 14 if(*(p+j)>=*(p+j+1) ) 15 { 16 temp=*(p+j); 17 *(p+j)=*(p+j+1); 18 *(p+j+1)=temp; 19 } 20 } 21 else if(Up_Or_Down==Down) 22 { 23 if(*(p+j)<=*(p+j+1) ) 24 { 25 temp=*(p+j); 26 *(p+j)=*(p+j+1); 27 *(p+j+1)=temp; 28 } 29 } 30 } 31 } 32 void main() 33 { 34 int i; 35 int a[]={1,3,5,7,2,4,6,8,10,9,13,11,12}; 36 for(i=0;i<DIM(a);i++) 37 printf("%d ",a[i]); 38 printf(" "); 39 40 Sort(a,DIM(a),Up); 41 42 for(i=0;i<DIM(a);i++) 43 printf("%d ",a[i]); 44 printf(" "); 45 46 Sort(a,DIM(a),Down); 47 48 for(i=0;i<DIM(a);i++) 49 printf("%d ",a[i]); 50 printf(" "); 51 }
3、算法分析
时间复杂度分析
最好的情况下是正序,一趟扫描即可完成排序,所需的比较次数和移动次数分别为: , 。所以,冒泡排序最好的时间复杂度为 。
最坏的情况下是反序,需要进行n-1趟排序,所需的比较次数和移动次数分别为:
,冒泡排序的最坏时间复杂度为
。
综上,因此冒泡排序总的平均时间复杂度为 。