ソートについて
UWSCでソート処理を考えたついでに考えた。
ソートアルゴリズムはどれを使うべきだろうか?
並列処理を考えないのであれば、以下の通りと思う。
- O(n)のメモリーを使って良い?
- Yes: QuickSort(メモリー使用で安定化)のワーストケースが怖い?
- Yes: MergeSort
- No : QuickSort(ワーストケースは、境界値が極端な値をとり続けた場合)
- No : 安定ソートでないとダメ?
- Yes: In-place MergeSort
- No : QuickSortのワーストケースが怖い?、、、てかQuickSortのメモリ使用量はO(1)じゃない?
- Yes: CombSort
- No : QuickSort
- Yes: QuickSort(メモリー使用で安定化)のワーストケースが怖い?
CombSort、かなり優秀に思った。
MergeSortは、もちろん優秀。
再帰を使わない実装にして、使用メモリーは最大n/2。
QuickSortは再帰を使わない実装が思いつかないのが良くないところ。
(自前スタックを用意してのループは、再帰と同じ)
ゆえに、メモリーがシビアな場合、In-place MergeSortかCombSortの二択。
安定ソート以外はごみ、と言われるなら、メモリー使用量順に
QuickSort(インデックス配列で安定化) > MergeSort > In-place MargeSort
速度もだいたい同じ順序。