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