Ruby 数组排序的几种实现与性能比较

Ruby 数组排序的几种实现与性能比较

魏仁言  2010.8.21

  最近在学习《编程珠玑》,理面讲解了各种排序方法,并逐步详解优化每种排序的优点与缺点,很直观地技术描述了怎么通过优化来提高程序的性能,通过学习学到了很多知识,拓宽了解决问题的思路。这本书最大的特点就是他提出很多问题让你去思考,去解决,这些问题很实际的东东。(推荐你们去读读,品味她)。下面是我用Ruby实现的两种排序方法:插入排序与快速排序(花费了几个小时的调试,终于完成了,哈哈)。

  下面就上代码了>>>

#!/usr/bin/ruby require "time" puts "Hello, World.../n"; N=10000 a=[] #随机生成数组数据 for i in 0..N-1 if i%3==0 && i%2==0 a[i]=-rand(100) elsif i%4==0 && i%5==0 a[i]=-rand(100) a[i-1]=-a[i-1] else a[i]=rand(100) end end #a=[10,0,-3,20,16,6] puts a.join(" ") #插入排序1 def sort(a) #数组长度 len=a.length for i in 0..len-1 t=a[i] for j in 0..i if a[j]>t a[j],t=t,a[j] end end a[i]=t end return a end #插入排序2 def sort1(a) #数组长度 len=a.length for i in 0..len-1 for j in 0..i if j>0 and a[j-1]>a[i] a[i],a[j-1]=a[j-1],a[i] end end end return a end #快速排序 def qsort(a) l=0 len=a.length u=len-1 qsort1(a,l,u) return a end #快速排序实际运行过程 def qsort1(a,l,u) if l>=u return end m=l #puts "st:/nl:#{l}/tm:#{m}" for i in l+1..u #puts "i:#{i}/tm:#{m}" if a[i]<a[l] m=m+1 #puts "a[#{m}]<-a[#{i}]:a[#{m}]<-#{a[i]} " #puts "a[#{i}]<-a[#{m}]:a[#{i}]<-#{a[m]}" a[m],a[i]=a[i],a[m] end #puts a.join(" ") end a[l],a[m]=a[m],a[l] #puts a.join(" ") #puts "ed:/nl:#{l}/tm:#{m}" #puts "st1:/n:a[#{l}..#{m-1}]" qsort1(a,l,m-1) #puts "st2:/n:a[#{m+1}..#{u}]" qsort1(a,m+1,u) end #测试快速排序 start=Time.now puts "Start...#{start}" b=qsort(a) #b=qsort1(a,0,a.length-1) puts b.join(" ") ed= Time.now cs=ed-start puts "End...#{ed}" puts "Consnum..#{cs}s /n/n" #测试插入排序 start=Time.now puts "Start...#{start}" b=sort(a) puts b.join(" ") ed= Time.now cs=ed-start puts "End...#{ed}" puts "Consnum..#{cs}s /n/n"

 

在数据量大的话,两种实现在数量级差别太大了,以前只是听说,没有见过,现在终于知道算法的美妙之处了。

测试结果:

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

你可能感兴趣的:(编程,优化,算法,测试,Ruby,firefox)