1. 程式人生 > >七種排序方法個人總結

七種排序方法個人總結

1、氣泡排序法

  • 基本思路:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。
public static void bubbleSort0(int[] A){
    for(int i=0;i < A.length-1;i++){
        for(int j=i+1;j<A.length;j++){
            if(A[i] > A[j]){
                swap(A,i,j);
            }
        }
    }
}

外部迴圈每次將i個位置的數與後面的數依次比較,確保第i個數最小。

      氣泡排序複雜度分析

  • 最好情況下 :陣列本身有序,只需要進行n-1次比較,不需要交換,時間複雜度為O(n)
  • 最壞情況下 :陣列為逆序,此時需要比較n*(n-1)/2,並作等數量級的記錄移動,時間複雜度為O(n^2)

2、簡單選擇排序

  • 基本思路:每次在n-i+1(i=1,2,…,n-1) 個記錄中選取關鍵字最小的記錄作為有序序列的第i個記錄
  • 通過n-i次關鍵字間的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和第i(1<=i<=n)個記錄交換之。
      簡單選擇排序複雜度分析
  • 簡單排序最大的特點:交換移動資料次數相當少,最好情況下交換0次,最差請求交換n-1次;適用於陣列個數不多,但每個陣列元素較大的情況。

  • 時間複雜度:無論是最好最差情況,比較次數一樣多,n(n-1)/2,總的時間複雜度O(n^2)

  • 簡單選擇排序效能上略優於氣泡排序。

3、直接插入排序演算法

  • 將一個記錄插入到已經排好序的有序表中,從而得到一個新的、記錄數增1的有序表。
      直接插入排序複雜度分析
  • 最好情況下:在本身有序的情況下,共比較了n-1次,沒有移動的記錄,時間複雜度為O(n)。
  • 最壞情況下:在逆序情況下:比較了 n(n-1)/2次,而移動次數為(n+2)(n-2)/2次。
  • 平均比較 移動 次數:n^2/4,故直接插入排序的時間複雜度為O(n^2)。
  • 直接插入排序法比冒泡和簡單選擇排序的效能要好一些。

4、希爾排序演算法

  • 基本思想:小的關鍵字基本在前面,大的關鍵字基本在後面,不大不小的基本在中間。
  • 跳躍分割策略:將相距某個“增量”的記錄組成一個子序列,這樣才能保證在子序列內分別進行直接插入排序後得到的結果是基本有序而不是區域性有序。

      希爾排序可以理解為將一個大陣列按照間隔inc分為inc個小陣列,每個陣列按照直接插入排序進行處理

      希爾排序複雜度分析
  • 希爾排序的關鍵並不是隨便分組後各自排序,而是將相隔某個增量的陣列組成一個子序列,實現跳躍式的移動。
  • 增量的選擇實驗證明當增量序列為delt[k]=2^(t-k+1)-1( 0<=k<=t<=log2(n+1))時,效果較佳,但注意最後增量值必須等於1。
  • 此時時間複雜度為O(n^1.5)
  • 希爾排序因為是跳躍式記錄,故不是一個穩定的排序演算法。

5、堆排序

  • 簡單選擇排序的問題:沒有把每一趟的比較結果儲存下來,在後一趟的比較中,有許多比較在前一趟已經做過了。
      實現步驟
  • 假設有陣列長度為n,下標0~n-1
  • 先將陣列按照大堆頂格式的完全二叉樹進行排序。
  • 以下兩步迴圈n-1次後,可完成排序。

    • 將大頂堆的根節點最後一個節點交換位置。
    • 將剩餘的n-1個元素重新構造成一個大頂堆。
      堆排序複雜度分析
  • 構建大堆頂的時間複雜度為O(n)
  • 第i次取堆頂記錄重建堆需要O(logi)的時間,取n-1次,故重建堆的時間複雜度為O(nlogn)
  • 無論最好,最壞,平均時間複雜度均為O(nlogn)
  • 空間複雜度,只需要一個暫存單元
  • 由於記錄的比較與交換是跳躍式進行,故是一種不穩定的排序方法
  • 由於初始構建堆所需要的比較次數較多,不適合帶排序序列個數較少的情況。

6、歸併排序

  • 原理:假設初始序列含有n個記錄,則可以看成是n個能有序的子序列,每個子序列的長度為1,然後兩兩歸併,得到┎n/2┒(┎x┒表示不小於x的最小整數)個長度為2或1的有序子序列;再兩兩歸併,…,如此重複,直至得到一個長度為n的有序序列為止,這種排序方法稱為2路歸併排序。
  • 非遞迴的迭代方法,避免了遞迴時深度為log2^n的棧空間,所需空間只是用到申請歸併臨時用的tR陣列,因此空間複雜度為O(n),並且避免遞迴也在時間效能上有一定提升。
      歸併排序複雜度分析
  • 無論最好、最壞、平均來講總的時間複雜度為O(nlogn)
  • 對於遞迴歸併:由於需要與原始記錄序列同樣數量的儲存空間存放歸併結果及遞迴時深度為logn的棧空間,空間複雜度O(n+logn)
  • 非遞迴方式的歸併排序:空間複雜度為O(n)
  • 歸併排序為穩定的排序演算法。

7、快速排序

  • 基本思想:通過一趟排序將待排序記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可以分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。
      快速排序時間複雜度分析
  • 最優與平均時間複雜度O(nlogn)
  • 最壞時間複雜度O(n^2)
  • 空間複雜度O(logn)
  • 快速排序是一種不穩定的排序方法