排序演算法 (1)排序的穩定性

2022-08-16 14:15:17 字數 3172 閱讀 3049

2019-11-10  09:42:11  by衝衝

① 定義:能保證兩個相等的數,經過排序之後,其在序列的前後位置順序不變。(a1=a2,排序前a1在a2前面,排序後a1還在a2前面)

② 意義:穩定性本質是維持具有相同屬性的資料的插入順序,如果後面需要使用該插入順序排序,則穩定性排序可以避免這次排序。

比如,公司想根據「能力」和「資歷」(以進入公司先後順序為標準)作為本次提拔的參考,假設a和b能力相當,如果是穩定性排序,則第一次根據「能力」排序之後,就不需要第二次根據「」資歷

排序了,因為「資歷」排序就是員工插入員工表的順序。如果是不穩定排序,則需要第二次排序,會增加系統開銷。

① 穩定性排序:氣泡排序,插入排序、歸併排序、基數排序

② 不穩定性排序:選擇排序、快速排序、希爾排序、堆排序

(1)穩定性排序

① 氣泡排序

氣泡排序本質是,從左到右開始不斷把大的元素往後調(或者,從右往左開始不斷把小的元素往前調)。比較是比較相鄰的兩個元素,交換也是發生在這兩個元素之間。所以,如果兩個元素相等,你總不會無聊地把它倆交換一下吧。如果兩個相等元素沒有相鄰,那麼也會經過一波兩兩交換使他們相鄰,此時也不會發生交換。

② 插入排序

插入排序本質是,在乙個已經有序的小序列基礎上,通過從右往左比較,一次插入乙個元素。剛開始這個小序列只有乙個元素。比較是從有序序列的末尾開始,想插入的元素和已經有序的最大者開始比較,如果比它大則直接插在其後面,否則一直往前比較,直到找到比它小的或與它相等的,然後插在其後面。

③ 歸併排序

歸併排序本質是,把序列遞迴地分成短序列,遞迴出口是短序列只有1個元素(此時認為直接有序)或者2個序列(1次比較和交換),然後把各個有序的短序列合併成乙個有序的長序列,不斷合併直到原序列全部排好序。當存在1個或2個元素時,1個元素不會交換,2個元素如果大小相等也沒有人故意交換,因此不會破壞穩定性。那麼在短的有序序列合併的過程中,穩定是否受到破壞?沒有。合併過程中當兩個當前元素相等時,處在前面序列的元素依然儲存在結果序列的前面。

④ 基數排序

基數排序本質是,按照低位先排序,然後收集,再按照高位排序,然後再收集,依次類推,直到最高位。比如序列「171(1),331,171(2)」,低位排序(個位)結果是「171(1),331,171(2)」,高位排序(十位)結果是「331171(1),171(2)」,高位排序(百位)結果是「171(1),171(2),331」。

(2)不穩定性排序

① 選擇排序

選擇排序本質是,給每個位置選擇剩下元素中最小的。比如給第乙個位置選擇最小的,給第二個位置選擇剩餘元素裡面第二小的,依次類推。例如序列「5(1),8,5(2),2,9」,5(1)會和2交換,破壞穩定性。

② 快速排序

快速排序本質是,選取第乙個元素為中樞元素a[center_index](index=0)。從兩個方向入手,首先左邊的i下標一直往右走,當a[i] > a[center_index]停止,由右邊的j下標開始往左走,當a[j] <= a[center_index]停止,由左邊i下標開始剛才的表演,重複上面的過程,直到i>j,交換a[j]和a[center_index],完成一趟快速排序。在中樞元素和a[j]交換的時候,很有可能把前面的元素的穩定性打亂,比如序列為 「5,3(1),4,3(2),8,11,9」, 現在中樞元素5和3(2)交換就會把元素3的穩定性打亂。不穩定發生在中樞元素和a[j]交換的時刻

③ 希爾排序

希爾排序本質是,按照不同步長對元素進行插入排序,當剛開始元素很無序的時候,步長最大,所以插入排序的元素個數很少,速度很快;當元素基本有序了,步長很小,插入排序對於有序的序列效率很高。所以,希爾排序的時間複雜度會比o(n^2)好一些。由於多次插入排序,我們知道一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,所以shell排序是不穩定的。

④ 堆排序

堆排序本質是,我們知道堆的結構是節點i的孩子為2*i和2*i+1節點,大頂堆要求父節點大於等於其2個子節點,小頂堆要求父節點小於等於其2個子節點。在乙個長為n的序列,堆排序的過程是從第n/2開始和其子節點共3個值選擇最大(大頂堆)或者最小(小頂堆),這3個元素之間的選擇當然不會破壞穩定性。但當為n/2-1, n/2-2, ...1這些個父節點擊擇元素時,就會破壞穩定性。有可能第n/2個父節點交換把後面乙個元素交換過去了,而第n/2-1個父節點把後面乙個相同的元素沒有交換,那麼這2個相同的元素之間的穩定性就被破壞了。所以,堆排序不是穩定的排序演算法。

排序演算法

類別排序方法

時間複雜度

空間複雜度

穩定性應用依據

剖析 平均情況

最好情況

最壞情況

輔助記憶體

插入排序

直接插入

o(n2)

o(n)

o(n2)

o(1)

穩定大部分已經排序

希爾排序

o(n1.3)

o(n)

o(n2) 

o(1)

不穩定 

選擇排序

直接選擇

o(n2)

o(n2)

o(n2)

o(1)

不穩定n比較小

堆排序

o(nlog2n)

o(nlog2n)

o(nlog2n) 

o(1)

不穩定n比較大

交換排序

氣泡排序

o(n2)

o(n) 

o(n2) 

o(1) 

穩定n比較小

快速排序

o(nlog2n)

o(nlog2n) 

o(n2) 

o(log2n)~o(n)

不穩定n比較大

歸併排序

o(nlog2n)

o(nlog2n)

o(nlog2n) 

o(1)

穩定n比較大

基數排序

o(1)

穩定 

排序演算法穩定性

學習中,有個問題叫做排序演算法穩定性 若待排序的序列中,存在多個具有相同關鍵字的記錄,經過排序,這些記錄的相對次序保持不變,則稱該演算法是穩定的 若經排序後,記錄的相對 次序發生了改變,則稱該演算法是不穩定的。假定在待排序的記錄序列中,存在多個具有相同鍵值的記錄,若經過排序,這些記錄的相對次序保持不...

排序演算法穩定性

快速排序 希爾排序 堆排序 直接選擇排序不是穩定的排序演算法,而基數排序 氣泡排序 直接插入排序 折半插入排序 歸併排序是穩定的排序演算法 首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前2個相等的數其在序列的前後位置順序和排序後它們兩個的前後位置順序相同。在簡單形式化一下,如果ai...

排序演算法穩定性

排序演算法穩定性 概念 假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,ri rj,且ri在rj之前,而在排序後的序列中,ri仍在rj之前,則稱這種排序演算法是穩定的 否則稱為不穩定的。排序的穩定性是指如果在排序的序列中,存在前後相同的...