sort関数によるシャッフルについて、続
トラックバックしてもらった情報によると、さっきのはSchwartzian Transformと呼ばれるアルゴリズムの応用らしい。
http://blog.livedoor.jp/dankogai/archives/50614134.html
まずは、Fisher-Yates法。コードは最速インターフェース研究会 :: 実践JavaScriptで配列をシャッフルする方法リファクタリングほぼそのまま。
MacBook Pro上のSafariでもFirefox 1.5でも、0.1秒とかからない。
次に、snippets from shinichitomita’s journal - JavaScriptの配列をsort関数でシャッフルするそのまま。本来のSchwartzian Transformでは連想配列ではなく配列を使うのだけど、こちらの方がわかりやすいといえばわかりやすい。
Safariでは2秒弱ほどかかった。
このように、Schwartzian Transformは、コードがわかりやすいものの、20倍におよぶ速度差がある。煩雑に使うのであれば避けるべきかもしれない。
計算量の話で言うと、Fisher-YatesがO(n)なのに対して、Schwartzian TransformはソートしてるのでO(n log(n))かかるってことですかね。ブラウザのJavaScriptのsort()が内部で何ソートをやってるかは知らないのですが、Safariはバブルソートとかやってるんでしょうかしらね。