cf. RubyでクイックソートとRSpecでそのテストを書いてみる – 凸ろぐ
なんだかまどろっこしい書き方をしてるなあ。これでいいんじゃないか?
require 'benchmark'
class Array
def qsort
return self if self.size <= 1
pivot = self.shift
left = self.select{|x| x < pivot }
right = self.select{|x| pivot <= x }
return left.qsort + [pivot] + right.qsort
end
end
ary = [1,2,3,4,5,6,7,8,9,10].shuffle
ary2 = ary.dup
Benchmark.bm(13) do |x|
x.report("Array#sort: ") { ary.sort }
x.report("Array#qsort:") { ary2.qsort }
end
takatoh@nightschool $ ruby qsort.rb
user system total real
Array#sort: 0.000000 0.000000 0.000000 ( 0.000006)
Array#qsort: 0.000000 0.000000 0.000000 ( 0.000013)
Array#soft 速いな。やっぱり自前で作るよりあるものを使ったほうがいいってことか。
いや、リンク先の実装だと速いのか?
require 'benchmark'
class Array
def qsort
return self if self.size <= 1
mark = self[0]
right = Array.new
left = Array.new
(1..self.size-1).each do |i|
if self[i] <= mark
left.push(self[i])
else
right.push(self[i])
end
end
left = left.qsort
right = right.qsort
return left + [mark] + right
end
end
ary = [1,2,3,4,5,6,7,8,9,10].shuffle
ary2 = ary.dup
Benchmark.bm(10) do |x|
x.report("Array#sort: ") { ary.sort }
x.report("Array#qsort:") { ary2.qsort }
end
takatoh@nightschool $ ruby qsort2.rb
user system total real
Array#sort: 0.000000 0.000000 0.000000 ( 0.000006)
Array#qsort: 0.000000 0.000000 0.000000 ( 0.000019)
そんなことはなかった。