シェルソート

From Wikipedia, the free encyclopedia

クラス ソート
データ構造 配列
最悪計算時間 間隔に依存
最良計算時間 [1]
シェルソート
Step-by-step visualisation of Shellsort
間隔 23, 10, 4, 1 でのシェルソートの実行
クラス ソート
データ構造 配列
最悪計算時間 間隔に依存
最良計算時間 [1]
平均計算時間 間隔に依存
間隔については後述
最悪空間計算量 (in-place)
間隔5, 3, 1のシェルソートにおける要素の交換を示した図

シェルソート改良挿入ソート英語: Shellsort, Shell sort, Shell's method)は、1959年ドナルド・シェルが開発した[2]ソートアルゴリズム挿入ソートの一般化[3]であり、配列の中である程度間隔が離れた要素の組ごとに挿入ソートを行い、間隔を小さくしながら同様のソートを繰り返すことで高速化するアルゴリズムである。ただし、挿入ソートと異なり、安定ソートではなくなる。

アルゴリズムの基本は挿入ソートと同じである。挿入ソートは「ほとんど整列されたデータに対しては高速」という長所を持つが、隣接した要素同士しか比較・交換を行わないため、あまり整列されていないデータに対しては低速であった。
シェルソートは、「飛び飛びの列を繰り返しソートして、配列を大まかに整列された状態に近づけていく」ことにより、挿入ソートの長所を活かしたものである。
アルゴリズムの概略は次のとおりである。

  1. 適当な間隔 を決める(hの決め方については後述
  2. 間隔 をあけて取り出したデータ列に挿入ソートを適用する
  3. 間隔 を狭めて、2.を適用する操作を繰り返す
  4. になったら、最後に挿入ソートを適用して終了

動作例

初期データ:

83127564

この例では、間隔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にする。

12637485

間隔が1ということは、全体が同じ1つのグループということである。これを挿入ソートする。

12345678

間隔の決め方

C++による実装例

脚注

Related Articles

Wikiwand AI