天天看點

資料結構複習:常用排序算法小結排序算法的分類常用排序算法複雜度及穩定性算法特點面試考點

常用排序算法總結

  • 排序算法的分類
  • 常用排序算法複雜度及穩定性
    • 時間性能
    • 空間性能
    • 穩定性
  • 算法特點
    • 插入排序
    • 交換排序:
    • 選擇排序
    • 歸并排序
    • 基數排序
  • 面試考點
    • 算法改進
      • 冒泡排序
      • 快速排序
    • 選擇排序算法準則

說明:本部落格适合複習《資料結構》時閱讀。

排序算法的分類

比較類,非比較類

資料結構複習:常用排序算法小結排序算法的分類常用排序算法複雜度及穩定性算法特點面試考點

常用排序算法複雜度及穩定性

資料結構複習:常用排序算法小結排序算法的分類常用排序算法複雜度及穩定性算法特點面試考點

時間性能

平均的時間性能

時間複雜度為 O(nlogn) :快速排序、堆排序和歸并排序

時間複雜度為 O(n^2 ) :直接插入、冒泡和簡單選擇排序

時間複雜度為 O(n) : 基數排序

當待排記錄序列按關鍵字順序有序時

直接插入和冒泡排序:O(n)

快速排序:O(n^2) 。

原表是否有序,對簡單選擇排序、堆排序、歸并排序和基數排序的時間複雜度影響不大。

空間性能

所有的簡單排序方法(直接插入、起泡和簡單選擇) 和堆排序的空間複雜度為 O(1) ;

快速排序為 O(logn),為遞歸程式執行過程中,棧所需的輔助空間 ;

歸并排序所需輔助空間最多,其空間複雜度為O(n);

鍊式基數排序需附設隊列首尾指針 , 則空間複雜度為 O(rd) 。

穩定性

排序算法的穩定性:若待排序的序列中,存在多個具有相同關鍵字的記錄,經過排序,這些記錄的相對次序保持不變,則稱該算法是穩定的;若經排序後,記錄的相對次序發生了改變,則稱該算法是不穩定的。

穩定的排序算法:冒泡排序、插入排序、歸并排序和基數排序

不是穩定的排序算法:選擇排序、快速排序、希爾排序、堆排序

算法特點

插入排序

包括直接插入排序 , 二分插入排序 ,希爾排序

直接插入排序:對于有 n 個資料元素的待排序序列,n - 1 次資料比較 ,最好情況 0 次資料移動 (待排序的資料已經有序)。

注意:當 n<16(一說是n<8) 時 , 直接插入比 O(nlogn) 的排序方法快。

二分插入排序: 用二分查找方法找出應該插入的位置; 二分插入排序減少了關鍵字的比較次數 ,但資料元素的移動次數不變 , 其時間複雜度與直接插入排序相同。

希爾排序:設定增量作為距離,按照相同距離分組,對每組進行插入排序。減小增量,重複上述步驟。

綜上,插入排序對基本已經排好序的清單有較好的時間複雜度。

交換排序:

包括冒泡排序 , 快速排序。

快速排序:顧名思義。找到基準元素,周遊清單,大于或等于基準元素的放在基準元素的後面,小于基準元素的放在基準元素的前面。确定基準元素的位置之後,利用分治的思想快排基準元素前後的兩個子列。

基準元素的選取:快排不穩定,貿然選擇數組第一個元素可能導緻最壞結果(如果排序記錄基本有序,選擇的元素恰為最小元素,時間複雜度o(n^2))。是以可以選擇第一個資料元素、最後一個資料元素、中間位置的資料元素的中位數。

選擇排序

包括簡單選擇排序,堆排序。

簡單選擇排序:适用于待排序元素較少的情況。

堆排序:大頂堆和小頂堆,本身是一棵完全二叉樹。

ps:堆排序涉及到了樹的相關知識,比較難了解,附上某位前輩的連結:友情連結

歸并排序

多為二路歸并排序。

二路歸并排序: 分而治之,一趟歸并的時間複雜度為 O(n), 總共需進行 log2n 趟。

基數排序

包括計數排序,桶排序,基數排序,是根據關鍵字本身的性質進行排序,不通過待排序資料元素之間的比較。

桶排序:每個資料元素關鍵字的值将其配置設定到相應的桶中,要求關鍵字的取值範圍已知。

基數排序:“ 配置設定 ” 時,按目前“關鍵字位”所取值,将記錄配置設定到不同的“桶”中,每個隊列“桶”中記錄的 “關鍵字位” 相同;“ 收集 ”時,按目前關鍵字位取值從小到大将各“桶”首尾相鍊成一個連結清單。對每個關鍵字位均重複上兩步。

“ 配置設定 ”和“ 收集 ”的實際操作僅為修改連結清單中的指針和設定隊列的頭、尾指針;

面試考點

除了比較基本的各個排序算法的定義、特點,時間複雜度和空間複雜度分析以外,還經常考察算法的使用場景,算法的改進方法等。

算法改進

冒泡排序

方法1:設定一标志性變量pos,用于記錄每趟排序中最後一次進行交換的位置。由于pos位置之後的記錄均已交換到位,故在進行下一趟排序時隻要掃描到pos位置即可。

方法2:設定布爾變量isSorted作為标記。如果在本輪排序中,元素有交換,則說明數列無序;如果沒有元素交換,說明數列已然有序,直接跳出大循環。

方法3:雙向冒泡排序。

這裡再推薦一篇博文:友情連結

快速排序

可參考STL中的sort()函數:資料量n<8時采用插入排序,n>=8時采用快速排序。

選擇排序算法準則

一般而言,需要考慮的因素有以下四點:

設待排序元素的個數為n.

1)當n較大,則應采用時間複雜度為O(nlog2n)的排序方法:快速排序、堆排序或歸并排序序。

2)當n較大,記憶體空間允許,且要求穩定性:歸并排序

3)當n較小,可采用直接插入或直接選擇排序。

直接插入排序:當元素分布有序,直接插入排序将大大減少比較次數和移動記錄的次數。

直接選擇排序 :元素分布有序,如果不要求穩定性,選擇直接選擇排序

5)一般不使用或不直接使用傳統的冒泡排序。

6)基數排序是一種穩定的排序算法,但有一定的局限性:

  1、關鍵字可分解。

  2、記錄的關鍵字位數較少,如果密集更好

  3、如果是數字時,最好是無符号的

繼續閱讀