1. 程式人生 > >排序——氣泡排序

排序——氣泡排序

氣泡排序思想

將相鄰的元素兩兩進行比較,大的元素向後移動一位,第一輪迴圈比較後,最大的元素移到了最後位置,以此進行。(按升序來說)

  • 排序穩定性:穩定
  • 複雜度:O(n²)

實現版:

    /**
     * 氣泡排序
     * @param a 待排序陣列
     * @param n 陣列長度
     */
    private void bubbleSort(int a[], int n) {
        int i, j, tmp;
        for (i = n - 1; i >= 0; i--) {
            for (j = 0; j < n - 1; j++) {
                if (a[j] > a[j + 1]) {
                    tmp = a[j];
                    a[j] = a[j+1];
                    a[j+1] =tmp;
                }
            }
        }
    }

優化版一:

     * 設定一個標誌flag,預設為false      * 如果每輪發生元素交換則置為true      * 如果一輪比較沒有發生元素交換則說明元素已排好序,結束迴圈即可

    /**
     * 氣泡排序優化版
     * 設定一個標誌flag,預設為false
     * 如果每輪發生元素交換則置為true
     * 如果一輪比較沒有發生元素交換則說明元素已排好序,結束迴圈即可
     * @param a
     * @param n
     */
    private static void bubbleSort1(int a[], int n) {
        int i, j, tmp;
        boolean flag = false;
        for (i = n - 1; i >= 0; i--) {
            for (j = 0; j < n - 1; j++) {
                if (a[j] > a[j + 1]) {
                    tmp = a[j];
                    a[j] = a[j+1];
                    a[j+1] =tmp;
                    flag = true;
                }
            }
            if (!flag){
                break;
            }
        }
    }

優化版二:

某一輪結束位置為j,但是這一輪的最後一次交換髮生在lastSwap的位置,則lastSwap到j之間是排好序的,下一輪的結束點就不必是j--了,而直接到lastSwap即可

   private static void bubbleSort2(int a[], int n) {
       int i, j, lastSwap, tmp;
       for (j=n-1; j>0; j=lastSwap) {
           lastSwap=0;//每一輪要初始化為0,防止某一輪未發生交換,lastSwap保留上一輪的值進入死迴圈
           for (i=0; i<j; i++) {
               if (a[i] > a[i+1]) {
                   tmp=a[i];
                   a[i]=a[i+1];
                   a[i+1]=tmp;//最後一次交換位置的座標
                   lastSwap = i;
               }
           }
       }
   }