各類排序演算法比較

2021-08-21 20:15:47 字數 1450 閱讀 1116

排序演算法

重點時間複雜度

穩定性直接插入排序

將待插入元素插入到已有序序列中的某個合適位置,得到新有序序列

最壞情況下o(n*n)

y折半插入排序

在決定當前元素插入位置時不採用插入查詢的方式,而是二分查詢

相比直接插入,比較的次數明顯減半,但移動的次數沒有減少。所以還是o(n*n)

y二路插入排序

目標是減少移動的次數,準備乙個等長度空陣列,將第乙個元素先放入首位,下乙個待插入元素先於該首位做比較,如果小於它則從後往前放,如果大於它則從前往後放。

移動次數減半,直接插入的平均複雜度o(n*n/4),現在減少為o(n*n/8)

y希爾排序

一般設定增量序列為,每次的增量d將待排序列分成d組,組內元素間隔為d。每一組都使用插入排序排好,最後只剩下1組時就完成了。

因為前step個元素都是各組內首元素,所以外層迴圈從step+1到n依次遍歷待插入元素。由於增量序列的選取,時間下界可以達到o(n*logn)

n(每一組內都會進行插入排序,不保證相等元素的相對位置)

氣泡排序

基於交換的排序

o(n*n)

y快速排序

每次返回基準的位置並將待排序列分成小於基準和大於基準兩部分

o(n*logn)

n(如a\b兩個數相等,規定基準前的數是小於等於的數,基準後是大於的數,那麼如果基準選擇了a,則b會放到前面去。是基準的選擇的不確定性導致了不穩定的可能)

直接選擇排序

每i趟從待排序列中選擇乙個最小的元素與第i個位置的元素交換

o(n*n)

n(如5、8、5、2、9)

堆排序包括建堆和維護堆兩部分,它們都是基於乙個篩選的功能o(logn)(可以把[root+1...last]的堆更新為乙個[root...last]的堆,即把較大的數篩至底部)

o(n*logn)

n樹形選擇排序

競標賽選舉機制,將待排序序列作為葉子結點,這樣就可以將最小的元素選舉到堆頂,第一次彈出堆頂得最小元素,然後將相應葉子結點置∞,再推舉上來(只要比較logn個數)得到次小數。

o(n*logn),但是它比堆排序要更加浪費空間

y(兩個相等的元素肯定會被比較,只要規定取左結點為優秀者便可以保持穩定)

歸併排序

將兩個有序序列合併為乙個有序序列

o(n*logn),logn是歸併趟數,  n是每趟的比較次數

y基數排序

按位數來排序,從低位到高位

o(d*n),d是最長位數

y插入排序

希爾排序

各類排序演算法比較分析

基本上排序演算法,基於選擇的排序除了希爾,快排,歸併,堆排序之外沒啥實用性,只不過是練手的工具罷了,像 o n 2 這樣過高的時間複雜度,已經失去了它的實用意義了 排序類別 排序演算法 平均時間複雜度 最好情況 時間複雜度 最壞情況 時間複雜度 空間複雜度 穩定性適用場景 交換排序 氣泡排序 o n...

各類排序演算法的比較 摘抄

按平均時間將排序分為四類 1 平方階 o n2 排序 一般稱為簡單排序,例如直接插入 直接選擇和氣泡排序 2 線性對數階 o nlgn 排序 如快速 堆和歸併排序 3 o n1 階排序 是介於0和1之間的常數,即0 1,如希爾排序 4 線性階 o n 排序 如桶 箱和基數排序。各種排序方法比較 簡單...

各類排序演算法複雜度比較

各種排序演算法比較 各種常用排序演算法 類別排序方法 時間複雜度 空間複雜度 穩定性複雜性 特點最好 平均最壞 輔助儲存 簡單插入 排序直接插入 o n o n2 o n2 o 1 穩定簡單 希爾排序 o n o n1.3 o n2 o 1 不穩定複雜 選擇排序 直接選擇 o n o n2 o n2...