冒泡排序的三种实现方法

1330阅读 0评论2013-08-26 double_lq
分类:C/C++

冒泡排序的基本思想是:第i趟起泡排序是从第1到n-i+1一次比较相邻两个记录的关键字,并在“逆序”时交换记录,其结果是这n-i+1个记录中关键字最大的记录被交换到第n-i+1的位置上。整个排序需进行k(1<=k
最原始的起泡排序实现代码如下:
  
  1. void BubbleSort1(int a[],int n)
  2. {
  3.     int i,j;
  4.     for(i=1;i<n;i++)
  5.     {
  6.      for(j=0;j<n-i;j++)
  7.          {
  8.          if(a[j]>a[j+1])
  9.              {
  10.                  swap(a[j],a[j+1]);
  11.              }
  12.          }
  13.     }
  14. }
优化1:下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。
  代码如下:
  
  1. int BubbleSort2(int a[],int n)
  2. {
  3.     int j,k;
  4.     bool flag;
  5.     k=n;
  6.     flag=true;
  7.     while(flag)
  8.     {
  9.         flag=false;
  10.      for(j=0;j<k-1;j++)
  11.         {
  12.          if(a[j]>a[j+1])
  13.             {
  14.                 swap(a[j],a[j+1]);
  15.                 flag=true;
  16.             }
  17.         }
  18.         k--;
  19.         
  20.     }
  21.     return n-k;
  22. }

优化2:再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。

 代码如下:
   
  1. void BubbleSort3(int a[],int n)
  2. {
  3.     int j,k;
  4.     int flag;
  5.     
  6.     flag=n;
  7.     while(flag>0)
  8.     {
  9.         k=flag;
  10.         flag=0;
  11.      for(j=0;j<k-1;j++)
  12.         {
  13.          if(a[j]>a[j+1])
  14.             {
  15.                 swap(a[j],a[j+1]);
  16.                 flag=j+1;
  17.             }
  18.         }
  19.         
  20.     }
  21. }



  完整的测试代码如下:
     
   
  1. #include<iostream>
  2. using namespace std;


  3. void swap(int *a,int *b)
  4. {
  5.     *a=*a^*b;
  6.     *b=*b^*a;
  7.     *a=*a^*b;

  8. }

  9. void BubbleSort3(int a[],int n)
  10. {
  11.     int j,k;
  12.     int flag;
  13.     
  14.     flag=n;
  15.     while(flag>0)
  16.     {
  17.         k=flag;
  18.         flag=0;
  19.      for(j=0;j<k-1;j++)
  20.         {
  21.          if(a[j]>a[j+1])
  22.             {
  23.                 swap(a[j],a[j+1]);
  24.                 flag=j+1;
  25.             }
  26.         }
  27.         
  28.     }
  29. }

  30. int main()
  31. {
  32.     int a[8];
  33.     printf("please input the number:\n");
  34.     for(int i=0;i<8;i++)
  35.         scanf("%d",&a[i]);
  36.     BubbleSort(a,8);
  37.     for(i=0;i<8;i++)
  38.         cout<<a[i]<<" ";
  39.     cout<<endl;
  40.     return 0;

  41. }






上一篇:用直接选择排序实现查找最小的K个数
下一篇:Unix网络编程一之判断字节序列