当前位置:编程学习 > C/C++ >>

冒泡排序 两次优化

(1)bubble sort的定义是:进行n-1次排序,每次排序都要比较所有相邻的两个元素,但第i次排序时array尾部的i-1个元素都是排序好的,所以内层循环的长度是n-i。
算法实现如下
[java] 
 void bubbleSort( int array[]) {  
       for (int i = 1; i < array. length; ++i ) {  
             for (int j = 0; j < array. length - i ; ++j) {  
                   if (array[j] > array[j + 1]) {  
                         int tmp = array[j];  
                        array[j] = array[j + 1];  
                        array[j + 1] = tmp;  
                  }  
            }  
      }  
}  
 
 
(2)一次优化。我们可以想到这种极端情况:array本身就是排序好的,但是依照如上算法,我们仍然要遍历n平方/2次。原因在于,我们没有机制检查数组是否是排序好的。解决办法就是加入标识项,如果发现一次内层循环没有经过任何交换,则说明array已经排序完毕。算法实现如下:
[java]  
void bubbleSort( int array[]) {  
      boolean exchange = false ;  
      for (int i = 1; i < array. length; ++i) {  
            for (int j = 0; j < array. length - i; ++j) {  
                  if (array[j] > array[j + 1]) {  
                        int tmp = array[j];  
                       array[j] = array[j + 1];  
                       array[j + 1] = tmp;  
                        exchange = true;  
                 }  
           }  
            if (!exchange) {  
                  break ;  
           }  
     }  
 
 
(3)二次优化。我们再想象一种极端情况:array长度为n,但是只有0,1元素未排序,那么依照上一种优化算法我们依然要遍历2*n次。原因在于我们内层循环长度的设定依据是,i次排序array的后i-1个元素是排序好的,但实际上i次排序的循环长度取决于i-1次排序时最后的交换位置,例如i-1次排序的最后交换位置是index,则表明index之后的元素都已经排序完毕,我们只需要记录这个Index就得到了下次(i次)的循环长度。算法实现如下:
[java]  
void bubbleSort( int array[]) {  
      boolean exchange = false;  
      int index = 0;  
      int mark = array.length - 1;  
      for (int i = 1; i < array. length; ++i) {  
            for (int j = 0; j < mark; ++j) {  
                  if (array[j] > array[j + 1]) {  
                        int tmp = array[j];  
                       array[j] = array[j + 1];  
                       array[j + 1] = tmp;  
                        exchange = true ;  
                       index = j;  
                 }  
           }  
            if (!exchange) {  
                  break ;  
           }  
           mark = index;  
     }  
 
 
 
summary:
当然这种所谓的优化知识学院派的说法,实际工作中自己的水准在哪个级别上全靠自己。例如我本身就是个菜鸟,所以我向来只是停留在定义级别的bubble sort上。当然,学习的动力也来源于此。比如说这次学习、总结之后,也许还不能够一下子上升到quick sort的级别,但是起码可以把优化后的bubble sort运用到工作中去。
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,