數據結構排序算法穩定性總結——寫給自己看


一、排序分類

(1)插入類:直接插入排序、折半插入排序、希爾排序

(2)交換類:冒泡排序、快速排序

(3)選擇類:簡單選擇排序、堆排序(屬於樹形選擇排序)

(4)歸並類:2-路歸並排序

(5)分配類:基數排序

 

二、排序穩定性及其原因

(1)穩定排序:直接插入排序、折半插入排序、冒泡排序、2-路歸並排序、基數排序

  • 直接插入排序:每次將一個待排序的記錄,按其關鍵字的大小插入到已經排好序的一組記錄的適當位置上。在數組內部前半部為排好序的記錄,后半部是未排好序的。比較時從前半部后向前比較,所以不會改變相等記錄的相對位置。
  • 折半插入排序:將直接插入排序關鍵字比較時的查找利用“折半查找”來實現,本質並沒有改變還是一種穩定排序。
  • 冒泡排序:通過兩兩比較相鄰記錄的關鍵字,如果發生逆序,則進行交換。也不會改變相等記錄的相對位置。
  • 2-路歸並排序:將兩個有序表合並成一個有序表。每次划分的兩個子序列前后相鄰。合並時每次比較兩個有序子序列當前較小的一個關鍵字,將其放入排好序的序列尾部。因為兩子序列相鄰,合並時也沒有改變相等記錄的相對位置,所以也是穩定的。
  • 基數排序:對待排序序列進行若干趟“分配”和“收集”來實現排序。分配時相等記錄被分配在一塊,沒有改變相對位置,是一種穩定排序。

(2)不穩定排序:希爾排序、快速排序、堆排序

  • 希爾排序:采用分組插入的方法,將待排序列分割成幾組,從而減少直接插入排序的數據量,對每組分別進行直接插入排序,然后增加數據量,重新分組。經過幾次分組排序之后,對全體記錄進行一次直接插入排序。但是希爾對記錄的分組,不是簡單的“逐段分割”,而是將相隔每個“增量”的記錄分成一組(假如:有1~10十個數,以2為增量則分為13579、246810兩組)。這種跳躍式的移動導致該排序方法是不穩定的。
  • 快速排序:改進的冒泡排序。冒泡只比較相鄰的兩個記錄,每次交換只能消除一個逆序。快排就是通過交換兩個不相鄰的記錄,達到一次消除多個逆序。正是這個非順次移動導致該排序方法是不穩定的。
  • 堆排序:將待排序的記錄r[1..n]看出是一顆完全二叉樹的順序存儲結構,利用完全二叉樹雙親節點孩子節點之間的內在關系,選擇出最大(最小)的記錄。因為雙親和孩子節點在數組中的位置不是順次的,調整堆時是非順次移動,所以該排序也是不穩定的。

(3)不確定是否穩定的排序:簡單選擇排序

  • 簡單選擇排序:每次從未排序的記錄中選擇最小的關鍵字,將其放到排好序的記錄尾部。就該排序方法本身來講,它是一種穩定排序。但是如果實現時采用“交換記錄”的策略,就會產生不穩定現象,所以是否穩定取決於該算法采用的策略。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM