1. 程式人生 > 其它 >【資料結構與演算法】十大排序演算法的總結

【資料結構與演算法】十大排序演算法的總結

一圖統領

基礎排序

氣泡排序

誰大誰上,每一輪都把最大的頂到天花板
效率太低O(n²)——掌握swap

選擇排序

效率較低,但經常用它內部的迴圈方式來找最大值和最小值——怎麼一次性求出陣列的最大值和最小值
O(n²)

插入排序

雖然平均效率低,但是在序列基本有序時,它很快,所以也有其適用範圍
Arrays這個工具類在1.7裡面做了較大改動(元素少使用插入排序,元素多使用快排)

希爾排序(縮小增量排序)

是插排的改良,對空間思維訓練有幫助,排序元素的間隔interval

分治法

1.子問題拆分
2.遞迴求解子問題
3.合併子問題的解

快速排序

是軟體工業中最常見的常規排序法,其雙向指標掃描分割槽

演算法是核心,
往往用於解決類似問題,特別地partition演算法用來劃分不同性質的元素,
partition->selectK,也用於著名的top問題
O(NlgN),但是如果主元不是中位數的話,特別地如果每次主元都在陣列區間的一側,複雜度將退化為N²
工業優化:三點取中法,絕對中值法,小資料量用插入排序
快排重視子問題拆分

歸併排序

空間換時間——逆序對數
歸併重視子問題的解的合併

堆排序

用到了二叉堆資料結構,是繼續掌握樹結構的起手式
=插排+二分查詢

上面三個都是NlgN的複雜度,其中快排表現最好,是原址的不用開闢輔助空間;堆排也是原址的,但是常數因子較大,不具備優勢。

上面7種都是基於比較的排序,可證明它們在元素隨機順序情況下最好是NlgN

的,用決策樹證明


非比較排序

下面三個是非比較排序,在特定情況下會比基於比較的排序要快:

計數排序

可以說是最快的:O(N+k),k=maxOf(sourceArr)
用它來解決問題時必須注意如果序列中的值分佈非常廣(最大值很大,元素分佈很稀疏),
空間將會浪費很多
所以計數排序的適用範圍是:序列的關鍵字比較集中,已知邊界,且邊界較小

桶排序

先分桶,再用其他排序方法對桶內元素排序,按桶的編號依次檢出。(分配-收集)
用它解決問題必須注意序列的值是否均勻地分佈在桶中。
如果不均勻,那麼個別桶中的元素會遠多於其他桶,桶內排序用比較排序,極端情況下,全部元素在一個桶內,還是會退化成NlgN

其時間複雜度是:時間複雜度: O(N+C)

,其中C=N*(logN-logM),約等於N*lgN
N是元素個數,M是桶的個數。

基數排序

kN級別(k是最大數的位數)是整數數值型排序裡面又快又穩的,無論元素分佈如何,
只開闢固定的輔助空間(10個桶)

對比桶排序,基數排序每次需要的桶的數量並不多。而且基數排序幾乎不需要任何“比較”操作,而桶排序在桶相對較少的情況下,
桶內多個數據必須進行基於比較操作的排序。
因此,在實際應用中,對十進位制整數來說,基數排序更好用。

要求

時刻反思能否做到:
1、準確描述演算法過程
2、寫出(偽)程式碼
3、能分析時間複雜度
4、能靈活應用(知道優缺點和應用場景)

相關博文

【資料結構與演算法】簡單排序(選擇、冒泡、插入、希爾排序)、二分查詢

【資料結構與演算法】快速排序(三種程式碼實現以及工程優化)

【資料結構與演算法】歸併排序

【資料結構與演算法】堆排序

【資料結構與演算法】非比較排序(計數排序、桶排序、基數排序)