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