資料結構-各種排序演算法效率對比圖

tanggod發表於2014-02-13

為了加深記憶,製作此圖。



根據此表整理了排序對比圖,其中

1. 柱狀圖藍色表示是穩定的,柱狀圖黃色表示不穩定的;

2. 柱狀圖中間的數字表示時間複雜度,紅色字型表示最差時,黑色字型表示平均複雜度;

3. 柱狀圖虛線表示最差時的時間複雜度,因為氣泡排序,交換排序,選擇排序的最差和平均時間複雜度是一樣的,都是O(n^2),所以圖中看不見虛線;

4. 實線柱狀圖,即平均時間複雜度,效率從低到高依次是: 

 氣泡排序交換排序 ≈選擇排序 < 插入排序 <Shell排序 <堆排序 < 歸併排序 <快速排序

    大多數情況下,快速排序效率最高,但如果資料已經基本有序的情況下,效率退化到O(n^2)。

  1. 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法,時間複雜度為O(n^2)。

  2. 插入排序是把序列中的值插入一個已經排序好的序列中,直到該序列的結束。它比氣泡排序快2倍。一般不適合資料量比較大的場合或資料重複比較多的場合。

  3. 選擇排序在實際應用中和氣泡排序基本差不多,使用較少。

  4.  Shell排序是通過將資料分成不同的組,先對每一組進行排序,然後再對所有的元素進行一次插入排序,以減少資料交換和移動的次數,其中Shell排序比氣泡排序快5倍,比插入排序大致快2倍。Shell排序比起快速排序,歸併排序,堆排序慢很多。但shell演算法比較簡單,特別適合資料量在5000以下且效能要求不是很高的場合。

  5.   歸併排序先分解要排序的序列,從1分成2,2分成4,依次分解,當分解到只有1個一組的時候,就可以排序這些分組,然後依次合併回原來的序列中,這樣就可以排序所有資料。合併排序比堆排序稍微快一點,由於它需要一個額外的陣列,因此需要比堆排序多一些記憶體空間。

  6. 6

    快速排序是利用分治法,進行大規模遞迴的演算法,具體見下面步驟:      步驟1: 如果不多於1個資料,直接返回。      步驟2:般選擇序列最左邊的值作為支點資料。

         步驟3: 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。

        步驟4: 對兩邊利用遞迴排序數列。快速排序比大部分排序演算法都要快。儘管在某些特殊的情況下有比快速排序快的演算法,但通一般情況下,沒有比它更快的。

    快速排序比大部分排序演算法都要快。儘管在某些特殊的情況下有比快速排序快的演算法,但通一般情況下,沒有比它更快的。

  7. 7

      堆排序將是所有的資料先建成一個堆,如大頂堆(最大的資料在堆頂),然後將堆頂資料和序列的最後一個資料交換,然後重新建堆,交換資料,依次下去,就可以排序所有的資料。由於不需要大量的遞迴或者多維的暫存陣列,因此這對於資料量非常巨大的序列是很合適的,比如超過數百萬條記錄,因為快速排序,歸併排序都使用遞迴來設計演算法,在資料量非常大的時候,可能會發生堆疊溢位錯誤。



資料來源:

排序法 平均時間複雜度 最差情形 穩定度 額外空間 備註
氣泡排序 O(n2)  O(n2) 穩定 O(1) n小時較好
交換排序 O(n2)  O(n2) 不穩定 O(1) n小時較好
選擇排序 O(n2) O(n2) 不穩定 O(1) n小時較好
插入排序 O(n2) O(n2) 穩定 O(1) 大部分已排序時較好
Shell排序 O(nlogn) O(ns) 1<s<2 不穩定 O(1) s是所選分組
快速排序 O(nlogn) O(n2) 不穩定 O(nlogn) n大時較好
歸併排序 O(nlogn) O(nlogn) 穩定 O(1) n大時較好
堆排序 O(nlogn) O(nlogn) 不穩定 O(1) n大時較好

java排序原始碼下載:

http://download.csdn.net/detail/tanggod/6919719


相關文章