Chinaunix首页 | 论坛 | 博客
  • 博客访问: 538700
  • 博文数量: 129
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1888
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-20 11:09
文章分类

全部博文(129)

文章存档

2016年(1)

2015年(5)

2014年(64)

2013年(59)

我的朋友

分类: C/C++

2013-08-26 09:38:48

冒泡排序的基本思想是:第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. }






阅读(1324) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~