sortとsort_by

http://d.hatena.ne.jp/kkkkkkkk/20070606/p1の続きで、1〜100の配列のランダムソートについて。

id:sumimさん*1コメントを貰ったのとはてな匿名ダイアリーでリンクを貼られた内容がほぼ同じ。

(1..100).sort_by{ rand }

これは確かに最短コード。
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Enumerable#sort_by
実測してみよう。

def a(max)
  t0 = Time.new
   (1..max).sort_by{rand}
  time0 = (Time.now - t0) * 1e3
  print "#{(time0).to_i} ms\n"
end
def b(max)
  t1 = Time.new
   (1..max).sort{rand(3)-1}
  time1 = (Time.now - t1) * 1e3
  print "#{(time1).to_i} ms\n"
end
puts "--"
max=10000
a(max)
b(max)

puts "--"
max=20000
a(max)
b(max)

puts "--"
max=30000
a(max)
b(max)

puts "--"
max=40000
a(max)
b(max)

puts "--"
max=50000
a(max)
b(max)

結果。前者は件数がn倍に増えると、時間もn倍のオーダーで増えていくみたい。

  • -

73 ms
379 ms

  • -

185 ms
804 ms

  • -

223 ms
1433 ms

  • -

275 ms
1772 ms

  • -

348 ms
2369 ms

*1:"Smalltalk"と唱えると出現するOOPの精霊。