8種排序算法比較

8種排序算法,各算法名稱見下表或見源碼。運行程序時,將需要你輸入一數值,以確定對多少隨機數進行排序。然后將會顯示各排序算法的耗時。并且你可選擇時否進行正序和反序測試。

由于水平有限,可能存在一些錯誤,還請各位多多指點!

通過實驗我們可將結果列入下表。

以下是VC6.0(Release)+win2000pro+128MDDR+P4(1.6G)

因為在多任務操作系統下,系統將進行進程序調度,影響實驗結果。以下是經過稍微修正過的值。如果要取得更準確的值,我們得多次實驗求其平均值。

排序算法實驗比較(單位:秒)

n

方法

1K

10K

100K

200K

100K

正序

逆序

冒泡排序

0

0.422

44.790

188.462

0

31.459

冒泡排序2

0

0.281

30.335

131.771

0

27.568

快速排序

0

0

0.016

0.047

5.095

7.002

直接選擇排序

0

0.141

16.878

79.332

16.785

33.242

堆排序

0

0

0.031

0.109

0.031

0.015

直接插入排序

0

0.047

8.705

57.800

0

24.865

Shell排序

0

0

0.047

0.110

0.015

0.015

歸并排序

0

0

0.031

0.094

0.032

0.032

基數排序

0

0

0.47

0.109

0.047

0.046

算法與結果聯合分析

冒泡排序:在最優情況下只需要經過n-1次比較即可得出結果,(這個最優情況那就是序列己是正序,從100K的正序結果可以看出結果正是如此),但在最壞情況下,即倒序(或一個較小值在最后),下沉算法將需要n(n-1)/2次比較。所以一般情況下,特別是在逆序時,它很不理想。它是對數據有序性非常敏感的排序算法。

冒泡排序2:它是冒泡排序的改良(一次下沉再一次上浮),最優情況和最壞情況與冒泡排序差不多,但是一般情況下它要好過冒泡排序,它一次下沉,再一次上浮,這樣避免了因一個數的逆序,而造成巨大的比較。如(2,3,4,…,n-1,n,1),用冒泡排序需要n(n-1)/2次比較,而此排序只要3輪,共比較(n-1)+(n-2)+(n-3)次,第一輪1將上移一位,第二輪1將移到首位,第三輪將發現無數據交換,序列有序而結束。但它同樣是一個對數據有序性非常敏感的排序算法,只適合于數據基本有序的排序。

快速排序:它同樣是冒泡排序的改進,它通過一次交換能消除多個逆序,這樣可以減少逆序時所消耗的掃描和數據交換次數。在最優情況下,它的排序時間復雜度為O(nlog2n)。即每次劃分序列時,能均勻分成兩個子串。但最差情況下它的時間復雜度將是O(n^2)。即每次劃分子串時,一串為空,另一串為m-1(程序中的100K正序和逆序就正是這樣,如果程序中采用每次取序列中部數據作為劃分點,那將在正序和逆時達到最優)。從100K中正序的結果上看“快速排序”會比“冒泡排序”更慢,這主要是“冒泡排序”中采用了提前結束排序的方法。有的書上這解釋“快速排序”,在理論上講,如果每次能均勻劃分序列,它將是最快的排序算法,因此稱它作快速排序。雖然很難均勻劃分序列,但就平均性能而言,它仍是基于關鍵字比較的內部排序算法中速度最快者。

直接選擇排序:簡單的選擇排序,它的比較次數一定:n(n-1)/2。也因此無論在序列何種情況下,它都不會有優秀的表現(從上100K的正序和反序數據可以發現它耗時相差不多,相差的只是數據移動時間),可見對數據的有序性不敏感。它雖然比較次數多,但它的數據交換量卻很少。所以我們將發現它在一般情況下將快于冒泡排序。

堆排序:由于它在直接選擇排序的基礎上利用了比較結果形成。效率提高很大。它完成排序的總比較次數為O(nlog2n)。它是對數據的有序性不敏感的一種算法。但堆排序將需要做兩個步驟:-是建堆,二是排序(調整堆)。所以一般在小規模的序列中不合適,但對于較大的序列,將表現出優越的性能。

直接插入排序:簡單的插入排序,每次比較后最多移掉一個逆序,因此與冒泡排序的效率相同。但它在速度上還是要高點,這是因為在冒泡排序下是進行值交換,而在插入排序下是值移動,所以直接插入排序將要優于冒泡排序。直接插入法也是一種對數據的有序性非常敏感的一種算法。在有序情況下只需要經過n-1次比較,在最壞情況下,將需要n(n-1)/2次比較。

希爾排序:增量的選擇將影響希爾排序的效率。但是無論怎樣選擇增量,最后一定要使增量為1,進行一次直接插入排序。但它相對于直接插入排序,由于在子表中每進行一次比較,就可能移去整個經性表中的多個逆序,從而改善了整個排序性能。希爾排序算是一種基于插入排序的算法,所以對數據有序敏感。

歸并排序:歸并排序是一種非就地排序,將需要與待排序序列一樣多的輔助空間。在使用它對兩個己有序的序列歸并,將有無比的優勢。其時間復雜度無論是在最好情況下還是在最壞情況下均是O(nlog2n)。對數據的有序性不敏感。若數據節點數據量大,那將不適合。但可改造成索引操作,效果將非常出色。

基數排序:在程序中采用的是以數值的十進制位分解,然后對空間采用一次性分配,因此它需要較多的輔助空間(10*n+10), (但我們可以進行其它分解,如以一個字節分解,空間采用鏈表將只需輔助空間n+256)。基數排序的時間是線性的(即O(n))。由此可見,基數排序非常吸引人,但它也不是就地排序,若節點數據量大時宜改為索引排序。但基數排序有個前提,要關鍵字能象整型、字符串這樣能分解,若是浮點型那就不行了。

按平均時間將排序分為類:

?

(1)?平方階(O(n2))排序
  各類簡單排序,例如直接插入、直接選擇和冒泡排序;

?

(2)?線性對數階(O(nlog2n))排序
  如快速排序堆排序歸并排序

?

(3)?O(n1+§))排序
  §是介于0和1之間的常數。希爾排序便是一種;

?

(4)?線性階(O(n))排序
  本程序中的基數排序,此外還有桶、箱排序。


排序方法的選擇

因為不同的排序方法適應不同的應用環境和要求,所以選擇合適的排序方法很重要
(1)
n較小,可采用直接插入或直接選擇排序。
當記錄規模較小時,直接插入排序較好,它會比選擇更少的比較次數;

但當記錄規模較大時,因為直接選擇移動的記錄數少于直接插人,所以宜用選直接選擇排序。
這兩種都是穩定排序算法。
(2)若文件初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜(這里的隨機是指基準取值的隨機,原因見上的快速排序分析);這里快速排序算法將不穩定。

(3)
n較大,則應采用時間復雜度為O(nlog2n)的排序方法:快速排序、堆排序或歸并排序序。
快速排序是目前基于比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短;
堆排序雖不會出現快速排序可能出現的最壞情況。但它需要建堆的過程。這兩種排序都是不穩定的。
 ?
歸并排序是穩定的排序算法,但它有一定數量的數據移動,所以我們可能過與插入排序組合,先獲得一定長度的序列,然后再合并,在效率上將有所提高。
(4)特殊的箱排序、基數排序

它們都是一種穩定的排序算法,但有一定的局限性:
  1、關鍵字可分解。

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

trackback:?http://blog.csdn.net/ctang/article/details/37914


轉載于:https://www.cnblogs.com/JohnShao/archive/2011/08/30/2159058.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392116.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392116.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392116.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

兩個問題,關于XP進程優化及SVSP虛擬存儲平臺

這兩個問題讓我有點頭痛,是Boss這陣子布置給我的,都一段時間了,我還是沒找出合適的解決方案來答復Boss.第一個問題是:查查X200或X61中的進程,看哪些是可以不要的,停掉,但又不影響用戶使用。&…

數據挖掘—樸素貝葉斯分類算法(Java實現)

算法描述 (1)掃描訓練樣本數據集,分別統計訓練集中類別 Ci 的個數 Di 和屬于類別Ci 的樣本中屬性Ak取值Xk為 Dik 的實例樣本個數,構成統計表; (2)計算先驗概率和條件概率,構成概率表…

net core 獲取網站目錄

AppContext.BaseDirectory 獲取項目的根目錄轉載于:https://www.cnblogs.com/zxs-onestar/p/7147265.html

泰晤士報下載_《泰晤士報》和《星期日泰晤士報》新聞編輯室中具有指標的冒險活動-第1部分:問題

泰晤士報下載TLDR: Designing metrics that help you make better decisions is hard. In The Times and The Sunday Times newsrooms, we have spent a lot of time trying to tackle three particular problems.TLDR :設計度量標準以幫助您做出更好的決策非常困難…

速度一半永遠追不上_您將永遠不會知道自己應該怎么做的一半-沒關系。

速度一半永遠追不上by Ken Gilb肯吉爾伯(Ken Gilb) 您將永遠不會知道自己應該怎么做的一半-沒關系。 (You will never know half of what you think you should — and that’s ok.) Impostor syndrome is a real thing in software development. After 20 years in the indus…

c語言自學門檻,初學C語言的人最常問的幾個問題

初學C語言的人最常問的幾個問題C語言是一門通用計算機編程語言,應用廣泛。對于新手來說學習C語言并不是那么容易,下面是C語言初學者最常問的幾個問題,歡迎閱讀!1.多久能學會編程?這是一個沒有答案的問題。每個人投入的時間、學習效率和基礎都…

背景消除的魔力

圖片的功能非常強大,有一圖勝千言的效果,所以在文檔或演示文稿中使用圖片來增加趣味性是一種很棒的想法。但問題是,圖片通常會變為文字中間的獨立矩形,而不是真正與內容融合在一起。您可以在圖片中放置邊框或效果,使其…

Puppet 之 模板和模塊

1 概述模板文件是在puppet模塊下面templates目錄中以”.erb”結尾的文件,puppet模板主要用于文件,例如各種服務的配置文件,相同的服務,不同的配置就可以考慮使用模板文件。模塊是Puppet自包含的代碼和數據集合。絕大多數的清單都…

java異步io_Java中的異步IO與異步請求處理

java異步ioIn this article, I am trying to explain the difference between Async-IO and Async-Request processing in the HTTP request in the Java world.在本文中,我試圖解釋Java世界中HTTP請求中Async-IO和Async-Request處理之間的區別。 In the pre-Java …

異常檢測機器學習_使用機器學習檢測異常

異常檢測機器學習什么是異常檢測? (What is Anomaly Detection?) The anomaly detection problem has been a problem that has been frequently explored in the field of machine learning and has become a classic problem. Anomalies are any unusual sequenc…

數據挖掘—BP神經網絡(Java實現)

public class Test {public static void main(String args[]) throws Exception {ArrayList<ArrayList<Double>> alllist new ArrayList<ArrayList<Double>>(); // 存放所有數據ArrayList<String> outlist new ArrayList<String>(); // …

c語言掌握常用函數,c語言一些常用函數.pdf

c語言一些常用函數C 語言程序設計(常用函數說明)C 語言是 1972 年由美國的 Dennis Ritchie 設計發明的,并首次在 UNIX 操作系統的 DEC PDP-11 計算機上使用。它由早期的編程語言 BCPL(Basic Combind ProgrammingLanguage)發展演變而來。在 1970 年,AT&T 貝爾實驗室的 Ken T…

高階函數 - 函數節流

/*** 函數節流 - 限制函數被頻繁調用* param {Function} fn [需要執行的函數]* param {[type]} interval [限制多長的時間再重復執行fn]*/var throttle function(fn, interval) {var __self fn,timer,firstTime true;return function() {var args arguments,__me…

[CareerCup] 8.7 Chat Server 聊天服務器

8.7 Explain how you would design a chat server. In particular, provide details about the various backend components, classes, and methods. What would be the hardest problems to solve? 這個簡易的聊天服務器功能十分的有限&#xff0c;畢竟只是針對面試題的&…

react hooks使用_如何開始使用React Hooks:受控表格

react hooks使用by Kevin Okeh由Kevin Okeh 如何開始使用React Hooks&#xff1a;受控表格 (How to Get Started With React Hooks: Controlled Forms) React Hooks are a shiny new proposal that will allow you to write 90% cleaner React. According to Dan Abramov, Hoo…

特征工程tf-idf_特征工程-保留和刪除的內容

特征工程tf-idfThe next step after exploring the patterns in data is feature engineering. Any operation performed on the features/columns which could help us in making a prediction from the data could be termed as Feature Engineering. This would include the…

c語言定義數組a10 指定各元素,C語言填空題.doc

C語言填空題.doc二、填空題1、C 語言只有 32 個關鍵字和 9 種控制語句。2、每個源程序有且只有一個 main 函數&#xff0c;系統總是從該函數開始執行 C 語言程序。 3、C 語言程序的注釋可以出現在程序中的任何地方&#xff0c;它總是以 * 符號作為開始標記&#xff0c;以 */ 符…

貓狗隊列

功能要求&#xff1a; 用戶可以調用push方法將cat類或dog類的實例放入隊列中;用戶可以調用pollAll方法&#xff0c;將隊列中所有的實例按照進隊列的先后順序依次彈出;用戶可以調用pollDog方法&#xff0c;將隊列中dog類的實例按照進隊列的先后順序依次彈出;用戶可以調用pollCat…

如何使用HTML5,JavaScript和Bootstrap構建自定義文件上傳器

by Prashant Yadav通過Prashant Yadav 如何使用HTML5&#xff0c;JavaScript和Bootstrap構建自定義文件上傳器 (How to build a custom file uploader with HTML5, JavaScript, & Bootstrap) In this short article, we’ll learn how to create custom file uploader wit…

monkey測試===通過monkey測試檢查app內存泄漏和cpu占用

最近一直在研究monkey測試。網上資料很多&#xff0c;但都是一個抄一個的。原創的很少 我把檢查app內存泄漏的情況梳理一下&#xff1a; 參考資料&#xff1a; Monkey測試策略&#xff1a;https://testerhome.com/topics/597 Android Monkey測試詳細介紹&#xff1a;http://www…