シェルソート
From Wikipedia, the free encyclopedia
![]() 間隔 23, 10, 4, 1 でのシェルソートの実行 | |
| クラス | ソート |
|---|---|
| データ構造 | 配列 |
| 最悪計算時間 | 間隔に依存 |
| 最良計算時間 | [1] |
| 平均計算時間 |
間隔に依存 間隔については後述 |
| 最悪空間計算量 | (in-place) |

シェルソート(改良挿入ソート、英語: Shellsort, Shell sort, Shell's method)は、1959年にドナルド・シェルが開発した[2]ソートのアルゴリズム。挿入ソートの一般化[3]であり、配列の中である程度間隔が離れた要素の組ごとに挿入ソートを行い、間隔を小さくしながら同様のソートを繰り返すことで高速化するアルゴリズムである。ただし、挿入ソートと異なり、安定ソートではなくなる。
アルゴリズムの基本は挿入ソートと同じである。挿入ソートは「ほとんど整列されたデータに対しては高速」という長所を持つが、隣接した要素同士しか比較・交換を行わないため、あまり整列されていないデータに対しては低速であった。
シェルソートは、「飛び飛びの列を繰り返しソートして、配列を大まかに整列された状態に近づけていく」ことにより、挿入ソートの長所を活かしたものである。
アルゴリズムの概略は次のとおりである。
- 適当な間隔 を決める(hの決め方については後述)
- 間隔 をあけて取り出したデータ列に挿入ソートを適用する
- 間隔 を狭めて、2.を適用する操作を繰り返す
- になったら、最後に挿入ソートを適用して終了
動作例
初期データ:
| 8 | 3 | 1 | 2 | 7 | 5 | 6 | 4 |
この例では、間隔hを4→2→1(2の累乗)とする。
まず、h=4とする。色の同じ部分は、同じグループのデータ列である。
| 8 | 3 | 1 | 2 | 7 | 5 | 6 | 4 |
同じグループ内で挿入ソートし、h=2にする。
| 7 | 3 | 1 | 2 | 8 | 5 | 6 | 4 |
同じグループ内で挿入ソートし、h=1にする。
| 1 | 2 | 6 | 3 | 7 | 4 | 8 | 5 |
間隔が1ということは、全体が同じ1つのグループということである。これを挿入ソートする。
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
