冒泡排序是一种交换排序,基本思想是:相邻两两比较,若反序则交换。
定义交换操作函数:
1 void swap(int *p, int i, int j) 2 { 3 int temp = p[i]; 4 p[i] = p[j]; 5 p[j] = temp; 6 }
基本排序算法:
思想:i=0时,p[i]依次与后面的元素比较,如果后面的元素小,则交换位置,继续比较,直到将最小的元素交换到第一个位置,再从第二个开始与后面的比较。
缺点:效率低。
1 void BaseSort0(int *p) 2 { 3 int i,j; 4 for(i=0;i<LEN;i++) 5 { 6 for(j=i+1;j<LEN;j++) 7 { 8 if(p[i]>p[j]) 9 { 10 swap(p,i,j); 11 } 12 } 13 } 14 }
冒泡排序算法:
相邻两两比较。从序列后面开始向前冒泡,两两比较,反序交换位置。
1 void BubbleSort1(int *p) 2 { 3 int i,j; 4 for(i=0;i<10;i++)
5 {
6 for(j=9;j>i;j--) 7 { 8 if(p[j]<p[j-1]) 9 { 10 swap(p,j-1,j); 11 } 12 } 13 } 14 }
优化:
1 void BubbleSort2(int *p) 2 { 3 int i,j; 4 int flag=1; 5 for(i=0;i<10&&flag;i++) //如果没有交换,flag为0,跳出循环 6 { 7 flag = 0 //标签初始化 8 for(j=9;j>i;j--) 9 { 10 if(p[j]<p[j-1]) 11 { 12 swap(p,j-1,j); 13 flag = 1; //如果发生交换,标签置为1 14 } 15 } 16 } 17 }
复杂度:
最好情况:序列本身是有序的,根据最后优化的代码,比较次数为n-1,没有数据交换,时间复杂度O(n)
最坏情况:序列本身是逆序的,需要比较1+2+3+...+(n-1)=n(n-1)/2次,并进行等数量级的记录移动,时间复杂度为O(n2)