Ruby 數組排序的幾種實現與效能比較

來源:互聯網
上載者:User
Ruby 數組排序的幾種實現與效能比較

魏仁言  2010.8.21

  最近在學習《編程珠璣》,理面講解了各種排序方法,並逐步詳解最佳化每種排序的優點與缺點,很直觀地技術描述了怎麼通過最佳化來提高程式的效能,通過學習學到了很多知識,拓寬瞭解決問題的思路。這本書最大的特點就是他提出很多問題讓你去思考,去解決,這些問題很實際的東東。(推薦你們去讀讀,品味她)。下面是我用Ruby實現的兩種排序方法:插入排序與快速排序(花費了幾個小時的調試,終於完成了,哈哈)。

  下面就上代碼了>>>

#!/usr/bin/ruby<br />require "time"<br />puts "Hello, World.../n";</p><p>N=10000<br />a=[]<br />#隨機產生數組資料<br />for i in 0..N-1<br />if i%3==0 && i%2==0<br />a[i]=-rand(100)<br />elsif i%4==0 && i%5==0<br />a[i]=-rand(100)<br />a[i-1]=-a[i-1]<br />else<br />a[i]=rand(100)<br />end<br />end<br />#a=[10,0,-3,20,16,6]<br />puts a.join(" ")<br />#插入排序1<br />def sort(a)<br />#數組長度<br />len=a.length</p><p>for i in 0..len-1<br />t=a[i]<br />for j in 0..i<br />if a[j]>t<br />a[j],t=t,a[j]<br />end<br />end<br />a[i]=t<br />end</p><p>return a<br />end<br />#插入排序2<br />def sort1(a)<br />#數組長度<br />len=a.length<br />for i in 0..len-1</p><p>for j in 0..i<br />if j>0 and a[j-1]>a[i]<br />a[i],a[j-1]=a[j-1],a[i]<br />end<br />end</p><p>end</p><p>return a<br />end<br />#快速排序<br />def qsort(a)<br />l=0<br />len=a.length<br />u=len-1</p><p>qsort1(a,l,u)<br />return a<br />end<br />#快速排序實際運行過程<br />def qsort1(a,l,u)<br />if l>=u<br />return<br />end</p><p>m=l<br />#puts "st:/nl:#{l}/tm:#{m}"<br />for i in l+1..u<br />#puts "i:#{i}/tm:#{m}"<br />if a[i]<a[l]</p><p>m=m+1<br />#puts "a[#{m}]<-a[#{i}]:a[#{m}]<-#{a[i]} "<br />#puts "a[#{i}]<-a[#{m}]:a[#{i}]<-#{a[m]}"<br />a[m],a[i]=a[i],a[m]<br />end<br />#puts a.join(" ")</p><p>end</p><p>a[l],a[m]=a[m],a[l]<br />#puts a.join(" ")<br />#puts "ed:/nl:#{l}/tm:#{m}"<br />#puts "st1:/n:a[#{l}..#{m-1}]"<br />qsort1(a,l,m-1)</p><p>#puts "st2:/n:a[#{m+1}..#{u}]"<br />qsort1(a,m+1,u)<br />end<br />#測試快速排序<br />start=Time.now<br />puts "Start...#{start}"<br />b=qsort(a)<br />#b=qsort1(a,0,a.length-1)<br />puts b.join(" ")<br />ed= Time.now<br />cs=ed-start<br />puts "End...#{ed}"<br />puts "Consnum..#{cs}s /n/n"<br />#測試插入排序<br />start=Time.now<br />puts "Start...#{start}"<br />b=sort(a)<br />puts b.join(" ")<br />ed= Time.now<br />cs=ed-start<br />puts "End...#{ed}"<br />puts "Consnum..#{cs}s /n/n"</p><p>

 

在資料量大的話,兩種實現在數量級差別太大了,以前只是聽說,沒有見過,現在終於知道演算法的美妙之處了。

測試結果:

N:100

插入排序:0.0s

快速排序:0.0s

 

N:1000

插入排序:0.078s

快速排序:0.406s

 

N:10000

插入排序:1.125s

快速排序:34.953s

 

N:50000

插入排序:11.078s

快速排序:899.968s

 

 

N:100000

插入排序:36.796s

快速排序:3404.172s

 

以上只是在我的機器上測試的大概資料(因為當時,俺還開著QQ和FireFox等)。

 

在這次實踐中,讓我記住了ruby中是不能用++i和i++的,哈哈。實踐是最好的學習過程。

 

註:如需轉載,請註明出處,謝謝!

http://blog.csdn.net/savechina

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.