1、了解了冒泡排序算法的原理后,实现起来其实是多种多样的,其核心就在于交换。




2、下面是两种不同的实现方法:


(1)实现一(较大的数向右边移动):

//************************************ 
     
 
      // 参数a:数组首地址 
     
 
      // 参数n:数组大小 
     
 
      //************************************ 
     
 
      void  
      BubbleSort1( 
      int 
      * a,  
      int  
      n) 
     
 
      { 
     
 
           
      for  
      ( 
      int  
      i = 0; i < n - 1; i++) 
     
 
           
      { 
     
 
               
      for  
      ( 
      int  
      j = 0; j < n - 1 - i; j++)  
     
 
               
      { 
     
 
                   
      if  
      (a[j] > a[j + 1])    
      // 升序 
     
 
                   
      { 
     
 
                       
      a[j] = a[j] + a[j + 1]; 
     
 
                       
      a[j + 1] = a[j] - a[j + 1]; 
     
 
                       
      a[j] = a[j] - a[j + 1];

   

     

   


(2)为了阅读方便,定义一个用于交换的宏函数swap:


#define swap(x, y) (x = (x) + (y), y = (x) - (y), x = (x) - (y))

   


(3)则实现一可以改为:


//************************************ 
     
 
      // 参数a:数组首地址 
     
 
      // 参数n:数组大小 
     
 
      //************************************ 
     
 
      void  
      BubbleSort1( 
      int 
      * a,  
      int  
      n) 
     
 
      { 
     
 
           
      for  
      ( 
      int  
      i = 0; i < n - 1; i++) 
     
 
           
      { 
     
 
               
      for  
      ( 
      int  
      j = 0; j < n - 1 - i; j++)  
     
 
               
      { 
     
 
                   
      if  
      (a[j] > a[j + 1])    
      // 升序 
     
 
                   
      { 
     
 
                       
      swap(a[j], a[j + 1]); 
     
 
                   
      } 
     
 
               
      } 
     
 
           
      } 
     
 
      }

   


(4)实现二(与实现一相反的冒泡方向,较小的数向左边移动):



void  
      BubbleSort2( 
      int 
      * a,  
      int  
      n) 
     
 
      { 
     
 
           
      for  
      ( 
      int  
      i = 0; i < n - 1; i++) 
     
 
           
      { 
     
 
               
      for  
      ( 
      int  
      j = n - 1; j > i; --j)    
     
 
               
      { 
     
 
                   
      if  
      (a[j] < a[j - 1])    
      // 升序 
     
 
                   
      { 
     
 
                       
      swap(a[j], a[j - 1]); 
     
 
                   
      } 
     
 
               
      } 
     
 
           
      } 
     
 
      }

   


(5)注:在for语句中,前置或后置的自增/自减运算,对计算结果并无影响。即以下两句代码,效果一样:



for  
      ( 
      int  
      j = n - 1; j > i; --j)   
     
 
      for  
      ( 
      int  
      j = n - 1; j > i; j++)

   


(6)上述代码都是以升序为例做的,如需要改成降序,只需修改判断语句即可。




3、上述两种实现方法其实原理是一样的,就是一路交换相邻的两个数,将大的数放到右边(或是将小的数放到左边)。




4、但是,这里还有另一种实现方式,如我上一篇文章提到的,既然是求最大值,那么不一定要通过交换相邻位置的数来实现。




5、这里介绍另一种实现算法:确定最右边的位置为最大值,将其它位置的数与该位置的数比较,将较大的数放在该位置;具体仍以{1, 3, 8, 5, 7, 6, 9, 2, 0, 8}为例:



(1){1, 3, 8, 5, 7, 6, 9, 2, 0,8}  因为1<8,所以最右边仍为8;


(2){1, 3, 8, 5, 7, 6, 9, 2, 0,8}  因为3<8,所以最右边仍为8;


(3) {1, 3, 8, 5, 7, 6, 9, 2, 0,  8 }  因为8<8,所以最右边仍为8;

(4){1, 3, 8,5, 7, 6, 9, 2, 0, 8}  因为5<8,所以最右边仍为8;


(5){1, 3, 8, 5,7, 6, 9, 2, 0, 8}  因为7<8,所以最右边仍为8;


(6){1, 3, 8, 5, 7,6, 9, 2, 0, 8}  因为8=8,所以最右边仍为8;


(7){1, 3, 8, 5, 7, 6,9, 2, 0, 8}  因为9>8,所以最右边仍为9;{1, 3, 8, 5, 7, 6,8, 2, 0, 9}


(8){1, 3, 8, 5, 7, 6, 8,2, 0, 9}  因为9>2,所以最右边仍为9;


(9){1, 3, 8, 5, 7, 6, 9, 2,0, 9}  因为9>0,所以最右边仍为9;




6、根据上述内容,引出实现三和实现四(这两种方式严格来说并不是冒泡排序):


void  
      BubbleSort3( 
      int 
      * a,  
      int  
      n) 
     
 
      { 
     
 
           
      for  
      ( 
      int  
      i = n - 1; i > 0; i--) 
     
 
           
      { 
     
 
               
      for  
      ( 
      int  
      j = 0; j < i; j++)  
     
 
               
      { 
     
 
                   
      if  
      (a[i] < a[j])  
      // 升序 
     
 
                   
      { 
     
 
                       
      swap(a[i], a[j]); 
     
 
                   
      } 
     
 
               
      } 
     
 
           
      } 
     
 
      } 
     

         
     

         
     
 
      void  
      BubbleSort4( 
      int 
      * a,  
      int  
      n) 
     
 
      { 
     
 
           
      for  
      ( 
      int  
      i = 0; i < n - 1; i++) 
     
 
           
      { 
     
 
               
      for  
      ( 
      int  
      j = i + 1; j < n; j++)    
     
 
               
      { 
     
 
                   
      if  
      (a[i] > a[j])  
      // 升序 
     
 
                   
      { 
     
 
                       
      swap(a[i], a[j]);