排序算法性能分析

一、基於比較的排序算法

1.插入排序法

直接插入排序,希爾排序,不常用的:Tree sort;Library sort:Patience sorting

2.交換排序

冒泡排序,快速排序,不常用的:雞尾酒排序,奇偶排序

3.選擇排序

直接選擇排序,堆排序

4.歸併排序

歸併排序

二、不基於比較的排序算法

基數排序,桶排序

三、空間,時間複雜度,穩定性

         排序算法性能分析 - 楓葉 - 楓葉

1.O(n^2)性能分析

平均性能爲O(n^2)的有:直接插入排序,選擇排序,冒泡排序

在數據規模較小時(9W內),直接插入排序,選擇排序差不多。當數據較大時,冒泡排序算法的時間代價最高。性能爲O(n^2)的算法基本上是相鄰元素進行比較,基本上都是穩定的

2.O(nlogn)性能分析

平均性能爲O(nlogn)的有:快速排序,歸併排序,希爾排序,堆排序。其中,快排是最好的, 其次是歸併和希爾,堆排序在數據量很大時效果明顯。

這四種排序可看作爲“先進算法”,其中,快排效率最高,但在待排序列基本有序的情況下,會變成冒泡排序,接近O(n^2).

希爾排序對增量的標準沒有較爲滿意的答案,增量對性能會有影響。

歸併排序效率非常不錯,在數據規模較大的情況下,比希爾排序和堆排序要好

多數先進的算法都是因爲跳躍式的比較,降低了比較次數,但犧牲了排序的穩定性。

3. 插入排序,冒泡排序,二叉樹排序,歸併排序都是穩定的

 選擇排序,希爾排序,快速排序,堆排序是不穩定的。

四、排序算法選擇

1.數據規模較小

  (1)待排序列基本序的情況下,可以選擇直接插入排序

  (2)對穩定性不作要求宜用選擇排序,對穩定性有要求宜用插入或冒泡

2.數據規模不是很大

(1)完全可以用內存空間,序列雜亂無序,對穩定性沒有要求,快速排序,此時要付出log(N)的額外空間。

 (2)序列本身可能有序,對穩定性有要求,空間允許下,宜用歸併排序

3.海量級別的數據,必須按塊放在外存上

   (1)對穩定性有求,則可考慮歸併排序

    (2)對穩定性沒要求,宜用堆排序

4.序列初始基本有序(正序),宜用直接插入,冒泡,隨機快排

五、各排序算法整體分析

  冒泡排序、插入排序、希爾排序以及快速排序對數據的有序性比較敏感,尤其是冒泡排序和插入排序;

 選擇排序不關心表的初始次序,它的最壞情況的排序時間與其最佳情況沒多少區別,其比較次數爲 n(n-1)/2,但選擇排序可以   非常有效的移動元素。因此對次序近乎正確的表,選擇排序可能比插入排序慢很多。

冒泡排序在最優情況下只需要經過n-1次比較即可得出結果(即對於完全正序的表),最壞情況下也要進行n(n-1)/2 次比較,與選擇排序的比較次數相同,但數據交換的次數要多餘選擇排序,因爲選擇排序的數據交換次數頂多爲 n-1,而冒泡排序最壞情況下的數據交換n(n-1)/2 。冒泡排序不一定要進行 趟,但由於它的記錄移動次數較多,所以它的平均時間性能比插入排序要差一些。

插入排序在最好的情況下有最少的比較次數 ,但是它在元素移動方面效率非常低下,因爲它只與毗鄰的元素進行比較,效率比較低。

希爾排序實際上是預處理階段優化後的插入排序,一般而言,在 比較大時,希爾排序要明顯優於插入排序

快速排序採用的“大事化小,小事化了”的思想,用遞歸的方法,將原問題分解成若干規模較小但與原問題相似的子問題進行求解。快速算法的平均時間複雜度爲O(nlogn) ,平均而言,快速排序是基於關鍵字比較的內部排序算法中速度最快者;但是由於快速排序採用的是遞歸的方法,因此當序列的長度比較大時,對系統棧佔用會比較多。快速算法尤其適用於隨機序列的排序。

 

因此,平均而言,對於一般的隨機序列順序表而言,上述幾種排序算法性能從低到高的順序大致爲:冒泡排序、插入排序、選擇排序、希爾排序、快速排序。但這個優劣順序不是絕對的,在不同的情況下,甚至可能出現完全的性能逆轉。

對於序列初始狀態基本有正序,可選擇對有序性較敏感的如插入排序、冒泡排序、選擇排序等方法

對於序列長度 比較大的隨機序列,應選擇平均時間複雜度較小的快速排序方法

各種排序算法都有各自的優缺點,適應於不同的應用環境,因此在選擇一種排序算法解決實際問題之前,應當先分析實際問題的類型,再結合各算法的特點,選擇一種合適的算法


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章