DSA之常用的排序方法及其時間複雜度總結

數據結構與算法(DSA)學習筆記之排序

  • 數據結構中的一種基本運算,分爲內(部)排序和外(部)排序兩大類。

內排序:待排序的數據量不大,全部數據都可以放入內存,排序操作完全在內存中進行。

外排序:待排序的數據量大,全部數據不能同時放在內存中,需要藉助外存完成排序過程。涉及到數據內外存交換的問題,將數據分批讀到內存中去排序,然後寫入外存中。

常用的排序方法有:

  1. 插入排序
    1. 直接插入排序
    2. 希爾排序:又稱縮小增量排序,是插入排序的一種改進。在兩種請況下比較有效:1、當數據序列基本有序時;2、當數據量很少時。基本思想:將一個長的數據段劃分爲多個短的數據段,然後在每個短的數據段上利用直接插入排序進行排序,最後再將多個有序的短數據段拼接成整段數據段。
    3. 折半插入排序:在進行插入排序時,用折半查找法尋找插入位置,從而排序過程中的比較次數。
  2. 交換排序
    1. 冒泡排序:每次從數組最前端開始,逐漸向後掃描,找出本次範圍內的最大者放到本範圍的最後位置,然後重複這個過程。
    2. 快速排序:步驟:
      1. 從數組中選擇一個基準值:1.第一個元素;2.從第一、中間、最後三個元素中隨機選一個;3.選接近於中間值的元素。
      2. 遍歷整個數組,將所有小於和大於基準值的元素組成兩個子數組(無序的)
      3. 對子數組快速排序:利用分而治之思想,調用遞歸實現子數組排序
  3. 選擇排序:
    1. 直接選擇排序:每次從數組中選擇一個最小的元素轉移到一個新的有序數組中,遞歸實現,直至最後一個元素。
    2. 堆排序:每次將根元素(即堆頂元素)輸出,然後重排得到一個新的堆,再輸出堆頂元素;重複這個過程,直至堆中所有元素都輸出爲止。
    3. 樹形選擇排序
  4. 歸併排序:將兩個或兩個以上的有序序列合併爲一個有序序列。歸併排序就是反覆合併有序序列的過程,由最初的數量衆多的短順串,逐步合併爲一個包含所有數據的結果順串。
  5. 基數排序

八大排序算法:快速排序、冒泡排序、直接選擇排序、堆排序、歸併排序、直接插入排序、折半插入排序、希爾排序。

幾種內部排序方法的比較:

排序方法

最優時間複雜度

平均時間複雜度

最差時間複雜度

穩定性

插入排序

O(n)

O(n^2)

O(n^2)

穩定

冒泡排序

O(n^2)

O(n^2)

O(n^2)

穩定

選擇排序

O(n^2)

O(n^2)

O(n^2)

穩定

希爾排序

O(n^(3/2))

   

不穩定

快速排序

O(n log n)

O(n log n)

O(n^2)

不穩定

歸併排序

O(n log n)

O(n log n)

O(n log n)

穩定

堆排序

O(n log n)

O(n log n)

O(n log n)

不穩定

基數排序

O(n log n)

O(n log n)

O(n log n)

穩定

大多數情況下,我們用平均時間複雜度來衡量一個排序算法的優劣。

在幾種排序算法中,如果考慮平均時間複雜度的話,快速排序算法性能最好,歸併排序次之,堆排序最差;特別是當待排序數據量n很大時,歸併排序優於堆排序。

有算法理論證明,任何一種內部排序算法所能達到的最佳時間複雜度爲O(n log n)。

通常,平均時間複雜度爲O(n^2)的排序算法基本上是穩定的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章