對冒泡排序的理解和實例


Java冒泡排序

 

  冒泡排序(Bubble Sort)是一種簡單的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

  冒泡排序算法的運作如下:

  1.  比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2.  對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。
  3.  針對所有的元素重復以上的步驟,除了最后一個。
  4.  持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

    有一個數組 :

    int array [] = {5,4,3,2,1};

    現在要求從小到大進行排序,那么我們可以想象排序過后 應該是 {1,2,3,4,5}

    那么 冒泡排序 的原理就是 :

    每比較一輪,就把最大的放到最后面,這也是冒泡名稱的由來。

    那么我們先做第一輪比較吧!

    復制代碼
    for (int i = 0; i < a.length - 1; i++){
        if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的話,二者就交換順序
            int temp = a[ i + 1];
            a[i + 1] = a[ i ];
            a[ i ] = temp;
        }   
    }    
    復制代碼

    來細分一下 這個比較的過程 :

     i = 0 ,a[0] 和 a[1]比較,完成后數組的順序應該是 :

    4,5,3,2,1

     i = 1 ,a[1] 和 a[2]比較,比較完以后,數組的順序應該是 :

    4,3,5,2,1

    i = 2, a[2] 和 a[3]比較,比較完以后,數組的順序應該是:

    4,3,2,5,1

    i = 3, a[3] 和 a[4]比較,比較完以后,數組的順序應該是:

    4,3,2,1,5

    當i=4的時候,由於要判斷 i<a.length - 1,不滿足,故退出比較。

    所以第一輪比較完以后,數組的順序應該是 {4,3,2,1,5}.

     

    此時對比結果,還需要比較,那么到底需要比較幾輪呢?幾輪呢?輪呢?呢~~~~??

    如果 “每次把最大的數字冒到最后去” 算一輪的話,那么在最極端情況下[比如本例],那么應該是n-1輪,那么又有同學問了,為什么是n-1輪呢?

    那再舉個例子,2個數字 {2,1}比較的話,把大的放后面去要幾輪呢?1輪,也就是 2 - 1 輪,呵呵,推廣一下就是 n - 1輪了。

    所以 冒泡的代碼應該是這個樣子的 :

     

    復制代碼
    1 for(int j = 0 ; j < a.length - 1; j++){ // a.length - 1 標示 n - 1輪
    2     for (int i = 0; i < a.length - 1; i++){
    3      if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的話,二者就交換順序
    4          int temp = a[ i + 1];
    5          a[i + 1] = a[ i ];
    6          a[ i ] = temp;
    7      }   
    8   } 
    9 }
    復制代碼

    到這里冒泡其實已經結束了。

    但是其實還有一個優化空間。。。

    我們前面已經發現,

    經過第一輪排序,最大的一個已經到最后一個位置了。。

    經過第二輪排序,次大的一個已經到倒數第二個位置了。。

    以此類推,所以每經過一輪排序,那么“對應的倒數位置”的數字其實已經不用對比了。。。

    比如 經過第一輪排序,那么在進行第二輪排序的時候,倒數第一個其實已經不用對比了,因為再第一輪排序的時候,已經非常明確,最后一個就是最大的了。。

    所以這里就有一個優化的地方 :

     

    復制代碼
     for(int j = 0 ; j < a.length - 1; j++){ // a.length - 1 標示 n - 1輪
         for (int i = 0; i < a.length - 1 - j; i++){//這里減去一個 " j" ,那么每次比較 “對應的倒數位置”的數字就不會對比了
          if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的話,二者就交換順序
              int temp = a[ i + 1];
              a[i + 1] = a[ i ];
              a[ i ] = temp;
          }   
       } 
     }
    復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM