冒泡算法的优化

原文转自:http://blog.csdn.net/lengyuhong/article/details/4659552

冒泡算法的主要思想:

      冒泡排序和插入排序相类似,都是简单的排序算法 ,时间复杂度O(N^2)

      算法思想:

     1) 有n个数(存放在数组a[0]-a[n-1]中),第一趟将每相邻两个数比较,小的换到前面,经n-1次两两相邻比较后,最大的数已经“沉底”,放到最后的一个位置,小数上升“浮起”

     2) 第二趟对余下的n-1个数(最大的数已经“沉底”),按上法比较,经n-2次两两比较之后得次大的数

     3) 依此推算,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较

 

     算法实现代码:

     

[c-sharp]  view plain copy
  1. void betterBubble(int Array[],int Size){  
  2.     int i,j,temp;  
  3.     for(i=0;i<Size-1;i++){  
  4.         for(j=0;j<Size-1-i;j++){  
  5.             if(Array[j]>Array[j+1]){  
  6.                 temp = Array[j];  
  7.                 Array[j] = Array[j+1];  
  8.                 Array[j+1] = temp;  
  9.             }  
  10.         }  
  11.     }  
  12. }  
 

 

     问题:

     但如果只是这样单纯实现方法,会有些浪费。即如果一些数组,它进行过几趟之后,就已经完全排好序了,但根据这个还要继续在进行排序,这样会非常浪费。

    如1,2,3,4,5,6,7,8,9,10,进行一趟排序之后就已经拍好序,但程序还要在进行多趟排序

 

    解决方案:

   在进行一趟比较排序之后,马上就判断一下这个数组是否已经排好序了,如果已经排好了,那就直接退出。

  

[c-sharp]  view plain copy
  1. void betterBubble(int Array[],int Size){  
  2.     int i,j,temp;  
  3.     for(i=0;i<Size-1;i++){  
  4.         for(j=0;j<Size-1-i;j++){  
  5.             if(Array[j]>Array[j+1]){  
  6.                 temp = Array[j];  
  7.                 Array[j] = Array[j+1];  
  8.                 Array[j+1] = temp;  
  9.             }  
  10.         }  
  11.         if(isSorted(Array,Size))  
  12.             break;  
  13.     }  
  14. }  

 

   判断是否已经排好序了的函数isSorted()

 

[c-sharp]  view plain copy
  1. bool isSorted(int Array[],int Size){  
  2.     bool flag = true;  
  3.     for(int i=0;i<Size;i++){  
  4.         if(Array[i]>Array[i+1]){  
  5.             flag = false;  
  6.             break;  
  7.         }  
  8.     }  
  9.     return flag;  
  10. }  

  从0-n-1,只要有一个数不符合排序规矩,就说明这个数还没有排好序

 

 

更好的解决方案(更新时间:2009年10月18日19:57:38)

 

      前者的确是解决判断是否已经排好序的问题,但如果这n个数要经历所有的排序之后才能达到要求,这样反而使得这样的排序方法变得效率更差。

      其实我可以使用标记的方法

      在函数中定义一个bool 的变量 issorted ,在每趟对剩余的数字排序时,先把它设为true,然后当发生两个两个相邻的数没有按要求排时,在交换这两个数的同时,把issorted设为false,不然就一直保持为true。

      在进行好一趟排序之后,测试issorted这个变量的值,如果保持true,就说明已经排好序了,停止继续排序,不然进行下一趟排序。

 

具体代码:

[c-sharp]  view plain copy
  1. void betterBubble(int Array[],int Size){  
  2.     int i,j,temp;  
  3.     bool issorted;  
  4.     for(i=0;i<Size-1;i++){  
  5.         issorted = true;  
  6.         for(j=0;j<Size-1-i;j++){  
  7.             if(Array[j]>Array[j+1]){  
  8.                 temp = Array[j];  
  9.                 Array[j] = Array[j+1];  
  10.                 Array[j+1] = temp;  
  11.                 issorted = false;  
  12.             }  
  13.         }  
  14.         if(issorted)  
  15.             break;  
  16.     }  
  17. }  

原文转自:http://blog.csdn.net/lengyuhong/article/details/4659552

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值