1. 程式人生 > >數據結構(四十二)冒泡排序(O(n²))

數據結構(四十二)冒泡排序(O(n²))

stat wid 簡單的 逆序 其他 pub sta 進入 交換排序

  一、冒泡排序的定義

  冒泡排序(Bubble Sort)是一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。

  二、冒泡排序的實現

  1.非標準冒泡排序算法--最簡單的交換排序

  技術分享圖片

  思想就是讓每一個關鍵字,都和它後面的每一個關鍵字比較,如果大則交換,這樣第一位置的關鍵字在一次循環後一定變成最小值。

  然而缺陷就是,在排序號1和2之後,數字3反而到了最後一位。

// 不是標準的冒泡排序算法,因為它不滿足"兩兩比較相鄰記錄"的冒泡排序思想,是最簡單的交換排序而已。
    public static void BubbleSort0(int
[] L) { for (int i = 0; i < L.length; i++) { for (int j = i + 1; j < L.length; j++) { if (L[i] > L[j]) { Assistant_And_Test.swap(L, i, j); } } } }
  int[] array2 = {9,1,5,8,3,7,4,6,2};
  當i=0時,9與1交換,因為1比其他位置的數字都小,所以1在第0位
  當i=1時,9與5交換,5與3交換,3與2交換,所以2在第1位
  ...

  2.標準冒泡排序算法

  技術分享圖片技術分享圖片

    // 標準的冒泡排序算法
    public static void BubbleSort1(int[] L) {
        for (int i = 0; i < L.length; i++) {
            for (int j = L.length - 2; j >= i; j--) {
                if (L[j] > L[j + 1]) {
                    swap(L, j, j + 1);
                }
            }
        }
    }

  int[] array2 = {9,1,5,8,3,7,4,6,2};
  
當i=0時,j從7開始,6與2交換,4與2交換,7與2交換,3與2交換,8與2交換,5與2交換,9與1交換,1排在第0位,2的位置也上升了
  
當i=1時,j從7開始,7與4交換,8與3交換,9與2交換,2排在第1位,3和4的位置也上升了
  ...

  3.改進的冒泡排序

  技術分享圖片

  假設待排序的序列為{2,1,3,4,5,6,7,8,9},當i=0時,交換2和1,此時序列已經有序,但是算法仍然將i=1到8以及每個循環中的j循環都執行了一遍,盡管並沒有交換數據,但是之後的大量比較還是大大多余了。因此,增加一個標記變量flag來實現這一算法的改進。

    // 改進的冒泡排序算法,增加一個標記變量flag
    public static void BubbleSort2(int[] L) {
        boolean flag = true;    // 用flag來做標記
        for (int i = 0; i < L.length && flag; i++) {
            flag = false;        // 初始值為false
            for (int j = L.length - 2; j >= i; j--) {
                if (L[j] > L[j + 1]) {
                    swap(L, j, j + 1);
                    flag = true;// 如果有數據交換,則flag為true
                }
            }
        }
    }
  
  int[] array3 = {2,1,3,4,5,6,7,8,9};
  i=0,flag=false,j=7開始,8和9不交換,7和8不交換,...2和1交換,flag=true,進入for循環
  i=1,flag=false,j=7開始,沒有交換的,所以flag仍然等於false,不進入for循環,
  ...

  

  三、冒泡排序算法的時間復雜度

  對於改進的冒泡排序來說,如果待排序的序列本身就是有序的,那麽需要比較n-1次,交換0次,時間復雜度為O(n)。最壞的情況,即待排序的序列是逆序的情況下,此時需要比較1+2+3+...+(n-1) = n(n-1)/2次,並移動n(n-1)/2次,所以總的時間復雜度為O(n2)

數據結構(四十二)冒泡排序(O(n²))