ソートについて(その2)

普通はライブラリ提供のソートを利用する。
それ以外なら、クイックソート
ワーストケースが怖いなら、マージソート
モリーにきつい制限があるなら、コムソート。
さらに安定ソートを希望なら、In-place マージソート



Quick Sort

なんでも良いから、たいてい早いやつ。
そんなアナタにおススメ。


クイックソート - Wikipedia
モリーを潤沢に使えるなら、安定にすることも可能。


ピボット値の取り方が重要で、これが最小または最大あたりをとり続けると、ワーストケースになる。
とりあえず真ん中あたりを使えば、なんとかなる。
心配なら、先頭・中あたり・末尾の3値の中値を使えば、ほとんど大丈夫。
それでも心配な人は、別なソートをどうぞ。(それ以上の工夫はコストが高いか、別ソート)
ワーストケースを引く確率は相当低いと思うけど、引いた場合はIn-place Merge Sortより遅い。
悪意のある配列ソートを考慮するなら、使えない。

Comb Sort

とにかくメモリー使用量の少ないのをくれ、安定?どうでもいい。
そんなアナタにおススメ。


コムソート - Wikipedia
これも安定ソートではない。
売りはメモリー使用量とコードが単純なこと。
速度はマージソートに負けるかな。
ほとんどバブルソートなのに、ぐっと早くなるのは驚き。
ソート対象の比較回数は多め。

Merge Sort

モリーはまあ使ってよいよ。クイック嫌い。
そんなアナタにおススメ。


マージソート - Wikipedia
安定ソートであるのも評価できる。
再帰で工夫すれば、メモリー使用量はn/2.
ソート対象の比較回数が少ないのもメリットかな(比較コストが高い場合に有利)


個人的に一番好きなソート。
覚えるべき。

In-place Merge Sort

とにかくメモリー使用量の少ないのをくれ、あ、あと安定ね。
そんな贅沢なアナタにおススメ。


ksksts's blog: C#でin place merge sortを書いてみたらかなり遅かった
遅いよね。
スワップに工夫する余地がある気がするけど、、、。
そうでもないのかな。


既に整列済みのケースだけは、ただのマージソートより早い。
、、、けど、整列済み最速は、挿入ソート。