排序演算法----不穩定排序
阿新 • • 發佈:2018-11-08
1 不穩定排序
穩定排序的定義是:在排序過程中,如果兩個鍵的值相同,那麼他們的相對位置不發生變化。不符合該規則的排序演算法不是穩定排序演算法。
2 排序演算法
- 氣泡排序: 通過元素兩兩交換的方式,每次將陣列的未排序區域的一個最大/小元素歸位
- 插入排序: 通過元素插入的方式,每次將陣列的未排序區域的一個最值元素歸位
- 選擇排序: 通過單個元素相互交換的方式,每次將陣列的未排序區域的一個最值元素歸位
- 基數排序: 通過按位比較的方式,每次完成全部資料的一個位的比較
- 希爾排序:通過不斷縮小基數進行每個基數長度的插入排序
- 快速排序:通過相互交換的方式,每次將資料的一個元素歸位
- 分治排序:通過先分再合的方式,保證每次合併操作時所有的單個的part為有序,再合併兩個有序陣列
- 堆排序: 通過維護堆的性質,每次增加/刪除都進行堆性質的維護
- 計數排序:在數字的範圍確定後,用一個list來記錄每一個數值的個數,在影象裡面用到比較多
3 哪些演算法不是穩定排序的
快速排序不是穩定的,因為在最後一次num[left] 與 num[key]交換時,如果相同的話會導致順序變化
希爾排序不是穩定的,因為前面的排序與後面的排序無關
選擇排序不是穩定的,因為在交換兩個key時,可能被交換的那個key其數值可能在後面出現;
[7, 3, 3, 2] -> [3, 7, 3, 2] -> [3, 7, 3, 2] -> [2, 7, 3, 3] 所以3的順序發生了變化
堆排序不是穩定的,因為在堆性質維護的時候,可能導致相同的資料位置發生變換
stl sort() 是不穩定排序,因為用到了快速排序 + 插入排序 + 堆排序
stl stable_sort()是穩定排序,如其名
4 reference