ソートのアルゴリズム

概要

ソート(sort)は、データの集合を一定の規則に従って並べること。
値の小さい順に並べる場合を昇順(ascending order)と言い、大きい順に並べることを降順(descending order)と言う。

主なソーティングアルゴリズムと性能

ここでは、独断と偏見に基づき、学習または実用性の観点から有効なアルゴリズムを挙げています。

名称   平均
計算時間
最悪
計算時間
メモリ
使用量
安定 手法 備考
バブルソート O(n2) O(1) 交換 同等性能のアルゴリズムとして、ノームソート(バブルソートと挿入ソートのハイブリッド)、シェーカーソート(カクテルソート)、奇偶転置ソートがある。
コームソート O(n log n) O(n log n) O(1) × 交換 コードサイズが小さくて済む。
挿入ソート O(n + d) O(n2) O(1) 挿入 ほとんど整列されたデータに対しては高速、d は置換群の反転数で、O(n2)
シェルソート O(n log2 n) O(1) × 挿入  
2分木ソート O(n log n) O(n log n) O(n) 挿入 データの2分木(平衡2分探索木)を構築し、2分木を使ってソート
ライブラリソート O(n log n) O(n2) O(n) 挿入 間隔を空けたリスト要素間で行う挿入ソート
マージソート O(n log n) O(n log n) O(n) マージ マージソートの空間を最適化した手法として、メモリ使用量の低減に貢献する
In-place マージソート」がある
クイックソート
(スタックソート)
O(n log n) O(n2) O(log n) × 分割 単純な実装ではメモリ使用量が O(n) になる。
ピボット値として中央値を使えば、最悪時間が O(n log n)。
選択ソート O(n2) O(n2) O(1) × 選択 安定ソートとしても実装可能
ヒープソート O(n log n) O(n log n) O(1) × 選択 クイックソートとヒープソートのハイブリッドとして「イントロソート」がある
スムースソート O(n log n) O(1) × 選択 ヒープソートの小型版
バケットソート O(n * k) O(n2 * k) O(n * k)   ※1、※2
分布数えソート O(n + 2k) O(n + 2k) O(n + 2k)   ※1、※2
LSD 基数ソート O(n * k/s) O(n * k/s) O(n)    
MSD 基数ソート O(n * k/s) O(n * (k/s) * 2s) O((k/s) * 2s) ×    

※1…要素の定義域分の外部記憶が必要。
※2…入力データは定義域に一様分布すると仮定

本表において、n はデータの個数、k はキーの長さ、s は実装で使われるチャンクのサイズ

…と、まずは Wikipedia の参照でお茶を濁しておきます。

比較ソートの理論限界

 データの比較に基づいてソートを行う場合、最悪計算時間は、最低でもO(n log n)必要なことが知られている。

安定ソートの重要性

 安定ソート(stable sort - ソートの安定性)とは、同等なデータのソート前の順序が、ソート後も保存されるものをいう。例えば、身長/体重のデータを、まず身長順に整列し、次に体重順で並べ替えたとき、安定ソートを用いると、同じ体重のデータは身長順で並ぶ。
 レコードのような複数キーのデータにおいては十分に考慮する必要があるが、単一キー(値の単純な並べ替え)においては特に考慮する必要はない。

関連項目

更新履歴

2008/07/21: 作成


Back / Studying / Top