1. 程式人生 > >九大排序演算法小結(複雜度)

九大排序演算法小結(複雜度)



                                 九大排序演算法小結

前面分別實現了幾大排序演算法的程式碼,但並未進行解析

現在就從演算法的時間複雜度,空間複雜度進行談起

下面這幅圖是網上考培得,但很清晰,但少了一個計數排序

                                   

先進行一個巨集觀認識:

各種排序的穩定性,時間複雜度和空間複雜度總結:

 我們比較時間複雜度函式的情況:


                             時間複雜度函式O(n)的增長情況

    所以對n較大的排序記錄。一般的選擇都是時間複雜度為O(nlog2n)的排序方法

          線性對數階(O(nlog2n))排序  :快速排序、堆排序和歸併排序;

時間複雜度來說:

(1)平方階(O(n2))排序
  各類簡單排序:直接插入、直接選擇和氣泡排序;
 (2)線性對數階(O(nlog2n))排序
快速排序堆排序歸併排序 (3)O(n1+§))排序,§是介於0和1之間的常數。

       希爾排序(4)線性階(O(n))排序
  基數排序,此外還有桶、箱排序。

說明:

當原表有序或基本有序時,直接插入排序和氣泡排序將大大減少比較次數和移動記錄的次數,時間複雜度可降至On);

而快速排序則相反,當原表基本有序時,將蛻化為氣泡排序,時間複雜度提高為O

n2);

原表是否有序,對簡單選擇排序、堆排序、歸併排序和基數排序的時間複雜度影響不大。

穩定性:

       不穩定:當出現跳躍交換而不是相鄰交換現象(選擇排序 快速排序 shell排序)

排序演算法的穩定性:若待排序的序列中,存在多個具有相同關鍵字的記錄,經過排序, 這些記錄的相對次序保持不變,則稱該演算法是穩定的;若經排序後,記錄的相對 次序發生了改變,則稱該演算法是不穩定的。
    穩定性的好處:排序演算法如果是穩定的,那麼從一個鍵上排序,然後再從另一個鍵上排序,第一個鍵排序的結果可以為第二個鍵排序所用。基數排序就是這樣,先按低位排序,逐次按高位排序,低位相同的元素其順序再高位也相同時是不會改變的。另外,如果排序演算法穩定,可以避免多餘的比較;


穩定的排序演算法氣泡排序、插入排序、歸併排序和基數排序

不是穩定的排序演算法:選擇排序、快速排序、希爾排序、堆排序

選擇排序演算法準則:

每種排序演算法都各有優缺點。因此,在實用時需根據不同情況適當選用,甚至可以將多種方法結合起來使用。

選擇排序演算法的依據

影響排序的因素有很多,平均時間複雜度低的演算法並不一定就是最優的。相反,有時平均時間複雜度高的演算法可能更適合某些特殊情況。同時,選擇演算法時還得考慮它的可讀性,以利於軟體的維護。一般而言,需要考慮的因素有以下四點:

1.待排序的記錄數目n的大小;

2.記錄本身資料量的大小,也就是記錄中除關鍵字外的其他資訊量的大小;

3.關鍵字的結構及其分佈情況;

4.對排序穩定性的要求。

設待排序元素的個數為n.

1)當n較大,則應採用時間複雜度為O(nlog2n)的排序方法:快速排序、堆排序或歸併排序序。

   快速排序:是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分佈時,快速排序的平均時間最短;
      堆排序:  如果記憶體空間允許且要求穩定性的,

      歸併排序:它有一定數量的資料移動,所以我們可能過與插入排序組合,先獲得一定長度的序列,然後再合併,在效率上將有所提高。

2)  當n較大,記憶體空間允許,且要求穩定性 =》歸併排序

3)當n較小,可採用直接插入或直接選擇排序。

    直接插入排序:當元素分佈有序,直接插入排序將大大減少比較次數和移動記錄的次數。

    直接選擇排序 :元素分佈有序,如果不要求穩定性,選擇直接選擇排序

5)一般不使用或不直接使用傳統的氣泡排序。

6)基數排序它是一種穩定的排序演算法,但有一定的侷限性:
  1、關鍵字可分解。

2
、記錄的關鍵字位數較少,如果密集更好
3、如果是數字時,最好是無符號的,否則將增加相應的映射覆雜度,可先將其正負分開排序。

為何排序的穩定性很重要? 在初學排序時會覺得穩定性有這麼重要嗎?兩個一樣的元素的順序有這麼重要嗎?其實很重要。在基數排序中顯得尤為突出,如下:
演算法導論習題8.3-2說:如果對於不穩定的演算法進行改進,使得那些不穩定的演算法也穩定? 其實很簡單,只需要在每個輸入元素加一個index,表示初始時的陣列索引,當不穩定的演算法排好序後,對於相同的元素對index排序即可。 問:快速排序(不使用隨機化)是否一定比插入排序快? 答:不一定,當輸入陣列已經排好序時,插入排序需要O(n)時間,而快速排序需要O(n^2)時間。 ”氣泡排序和插入排序哪個更快“呢? 一般的人回答:“差不多吧,因為漸近時間都是O(n^2)”。 但是事實上不是這樣的,插入排序的速度直接是逆序對的個數,而氣泡排序中執行“交換“的次數是逆序對的個數,因此氣泡排序執行的時間至少是逆序對的個數,因此插入排序的執行時間至少比氣泡排序快。 歸併排序的缺點是什麼? 答:他是Out-place sort,因此相比快排,需要很多額外的空間。 問:為什麼歸併排序比快速排序慢? 答:雖然漸近複雜度一樣,但是歸併排序的係數比快排大。 問:對於歸併排序有什麼改進? 答:就是在陣列長度為k時,用插入排序,因為插入排序適合對小陣列排序