第三章:查詢與排序(下)----------- 3.22 總結:10種排序演算法的對比分析

Curtis_發表於2019-03-11

總結:10種排序演算法的對比分析:

 

*基礎排序*:

冒牌排序:

       描述:誰大誰上,每一輪都把最大的頂到天花板。

       效率太低 O(n²)------掌握swap。

選擇排序:

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

插入排序:

      雖然平均效率低,但在序列基本有序時,它很快,所有也有其適用範圍。

 希爾排序:

      縮小增量排序,是插排的改良,對空間思維的訓練有幫助。O(n的1.3次方)左右。

*分治法*:

1、子問題的拆分;

2、遞迴求解子問題;

3、合併子問題的解。

快速排序:

      快速排序是軟體工業中最常見的常規排序法,其雙向指標掃描和分割槽演算法是核心,往往用於解決類似問題,特別地partition演算法用來劃分不同性質的元素,也用於著名的topk問題。

      selectK問題。記住。

      O(NlgN),如果主元不是中位數,特別地,如果每次主元都在陣列區間的一側,複雜度將退化為n²。

      工業優化:三點取中法,絕對中值法,小資料量用插入排序。

      快排重視子問題的拆分。

 歸併排序:

      空間換時間----------逆序對。

      歸併排序重視子問題的合併。

 堆排序:

      用到了二叉堆的資料結構。是掌握樹結構的起手式。

      ==堆排+二分查詢。

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


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


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

計數排序:

      可以說是最快的:O(N+k),k=maxOf(sourceArr),用它來解決問題時必須注意如果序列中的值,分佈非常廣(最大值很大,元素比較稀疏),空間會浪費很多。

      所以計數排序的適用範圍是:**序列的關鍵字比較集中,已知邊界,且邊界較小**(比如:年齡)

桶排序:

      先分桶,再用其他排序方法對桶內元素排序,按桶的編號依次檢出。(分配--收集)

      用它來解決問題必須注意序列的值是否均勻地分佈在桶中。

      如果不均勻,那麼個別桶中的元素會遠多於其他桶,桶內排序用比較排序,極端情況下,全部元素都擠在一個桶裡,還是會退化為NlgN。

      其時間複雜度:O(N+C),其中,C=N*(logN-lgM),約等於NlgN,N是元素數量,M是桶的個數。

基數排序:

      kN級別(k是最大數的位數),是整數數值型排序裡面又快又穩的,無論元素分佈如何。

      只開闢固定的空間(10個桶)。

       對比桶排序,基數排序每次需要的桶數量並不多,而且基數排序幾乎不需要任何“比較”操作,而桶排序在桶數量相對較少時,資料難免集中到一個桶。桶內多個資料必須基於比較操作的排序。

       因此,在實際應用中,對十進位制整數來說,基數排序的更好用。


比較:

 


要求:

      1、準確描述演算法過程;

      2、寫出虛擬碼;

      3、能分析時間複雜度;

      4、能靈活應用。

相關文章