C语言排序算法——冒泡排序算法

冒泡排序是一种交换排序,基本思想是:相邻两两比较,若反序则交换。

定义交换操作函数:

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)

posted @ 2016-03-09 13:02  Mr_DaLiN  阅读(264)  评论(0编辑  收藏  举报