sortしてみた

作った物

  • bubble_sort
  • merge_sort

code

class Array
  def bubble_sort
    i=0; max_index=self.size-1
    each_index do |i|
      #p i
      return self if i >= max_index
      if self[i] > self[i+1]
        self[i],self[i+1]=self[i+1],self[i]
        i = 0
        retry
      end
      i += 1
    end
  end

   def merge_sort!(a=self,&block)
     return a if a.size <= 1
     cond = lambda {|x,y| x <= y} # unless block_given?
     def merge(left,right,&cond)
       tmp=[]
       loop do
         unless left.empty? || right.empty?
           tmp << (cond.call(left.first,right.first) ? left.shift : right.shift)
         else
           tmp << (left.empty? ? right : left)
           break
         end
       end
       tmp.flatten
     end
     n=a.size/2
     left=merge_sort!(a[0..n-1],&cond)
     right=merge_sort!(a[n..-1],&cond)
     merge(left,right,&cond)
   end

  def randomize
    each_index { |i| j=rand(i+1); self[i],self[j]=self[j],self[i]}
  end
end

#require  'benchmark'
# Benchmark.bmbm do |x|
#   a=(1..10000).to_a.randomize
#   x.report("quick") { a.dup.sort}
#  # x.report("bubble") { a.dup.bubble_sort}
#   x.report("merge") { a.dup.merge_sort!}
# end

merge_sortのところで、何故かブロックがうまく渡せていない。(あとで調べる)

結果

Rehearsal -----------------------------------------
quick   0.010000   0.000000   0.010000 (  0.003665)
merge   1.580000   0.240000   1.820000 (  1.876822)
-------------------------------- total: 1.830000sec

            user     system      total        real
quick   0.000000   0.000000   0.000000 (  0.003441)
merge   1.630000   0.170000   1.800000 (  1.912991)
>Exit code: 0

bubble_sortは200ぐらいから待つのが面倒になった。

感想

クイックソート早い。