1. 程式人生 > >排序演算法----不穩定排序

排序演算法----不穩定排序

1 不穩定排序

    穩定排序的定義是:在排序過程中,如果兩個鍵的值相同,那麼他們的相對位置不發生變化。不符合該規則的排序演算法不是穩定排序演算法。

 

2 排序演算法

  1. 氣泡排序: 通過元素兩兩交換的方式,每次將陣列的未排序區域的一個最大/小元素歸位
  2. 插入排序: 通過元素插入的方式,每次將陣列的未排序區域的一個最值元素歸位
  3. 選擇排序: 通過單個元素相互交換的方式,每次將陣列的未排序區域的一個最值元素歸位
  4. 基數排序: 通過按位比較的方式,每次完成全部資料的一個位的比較
  5. 希爾排序:通過不斷縮小基數進行每個基數長度的插入排序
  6. 快速排序:通過相互交換的方式,每次將資料的一個元素歸位
  7. 分治排序:通過先分再合的方式,保證每次合併操作時所有的單個的part為有序,再合併兩個有序陣列
  8. 堆排序:    通過維護堆的性質,每次增加/刪除都進行堆性質的維護
  9. 計數排序:在數字的範圍確定後,用一個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 

    https://blog.csdn.net/qq_35440678/article/details/80147601