1. 程式人生 > >排序演算法一--氣泡排序

排序演算法一--氣泡排序

 

  氣泡排序(BubbleSort)

基本思想:兩個數比較大小,較大的數下沉,較小的數冒起來

思路:

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

舉例說明:要排序陣列:int[] arr={6,3,8,2,9,1};   

第一趟排序:

    第一次排序:6和3比較,6大於3,交換位置:  3  6  8  2  9  1

    第二次排序:6和8比較,6小於8,不交換位置:3  6  8  2  9  1

    第三次排序:8和2比較,8大於2,交換位置:  3  6  2  8  9  1

    第四次排序:8和9比較,8小於9,不交換位置:3  6  2  8  9  1

    第五次排序:9和1比較:9大於1,交換位置:  3  6  2  8  1  9

    第一趟總共進行了5次比較, 排序結果:      3  6  2  8  1  9

---------------------------------------------------------------------

第二趟排序:

    第一次排序:3和6比較,3小於6,不交換位置:3  6  2  8  1  9

    第二次排序:6和2比較,6大於2,交換位置:  3  2  6  8  1  9

    第三次排序:6和8比較,6大於8,不交換位置:3  2  6  8  1  9

    第四次排序:8和1比較,8大於1,交換位置:  3  2  6  1  8  9

    第二趟總共進行了4次比較, 排序結果:      3  2  6  1  8  9

---------------------------------------------------------------------

第三趟排序:

    第一次排序:3和2比較,3大於2,交換位置:  2  3  6  1  8  9

    第二次排序:3和6比較,3小於6,不交換位置:2  3  6  1  8  9

    第三次排序:6和1比較,6大於1,交換位置:  2  3  1  6  8  9

    第二趟總共進行了3次比較, 排序結果:         2  3  1  6  8  9

---------------------------------------------------------------------

第四趟排序:

    第一次排序:2和3比較,2小於3,不交換位置:2  3  1  6  8  9

    第二次排序:3和1比較,3大於1,交換位置:  2  1  3  6  8  9

    第二趟總共進行了2次比較, 排序結果:        2  1  3  6  8  9

---------------------------------------------------------------------

第五趟排序:

    第一次排序:2和1比較,2大於1,交換位置:  1  2  3  6  8  9

    第二趟總共進行了1次比較, 排序結果:  1  2  3  6  8  9

---------------------------------------------------------------------

最終結果:1  2  3  6  8  9

平均時間複雜度:O(n2)

程式碼實現(java):

public static void BubbleSort(int [] arr){

     int temp;//臨時變數
     for(int i=0; i<arr.length-1; i++){   //表示趟數,一共arr.length-1次
         for(int j=arr.length-1; j>i; j--){

             if(arr[j] < arr[j-1]){
                 temp = arr[j];
                 arr[j] = arr[j-1];
                 arr[j-1] = temp;
             }
         }
     }
 }

優化:

  • 針對問題:
    資料的順序排好之後,冒泡演算法仍然會繼續進行下一輪的比較,直到arr.length-1次,後面的比較沒有意義的。

  • 方案:
    設定標誌位flag,如果發生了交換flag設定為true;如果沒有交換就設定為false。
    這樣當一輪比較結束後如果flag仍為false,即:這一輪沒有發生交換,說明資料的順序已經排好,沒有必要繼續進行下去。

public static void BubbleSort1(int [] arr){

   int temp;//臨時變數
   boolean flag;//是否交換的標誌
   for(int i=0; i<arr.length-1; i++){   //表示趟數,一共arr.length-1次。

       flag = false;
       for(int j=arr.length-1; j>i; j--){

           if(arr[j] < arr[j-1]){
               temp = arr[j];
               arr[j] = arr[j-1];
               arr[j-1] = temp;
               flag = true;
           }
       }
       if(!flag) break;
   }
}