コムソート(Comb Sort)とは
コム
ソートは、1980年にWłodzimierz Dobosiewicz氏によって発表され、1991年にStephen Lacey氏とRichard Box氏によって再発見され、その際にコム
ソートと名付けられました。この
ソートアルゴリズムは、バブル
ソートの改良版として知られています。内部
ソートに分類されますが、安定
ソートではありません。
特徴
コム
ソートの大きな特徴は、その実行速度です。平均計算時間はほぼO(n log n)に達し、バブル
ソートと比較して大幅に高速化されています。これは、要素間の比較を行う間隔を徐々に狭めていくという、シェル
ソートと同様の改良アプローチによるものです。
コム
ソートの
アルゴリズムは、以下のステップで構成されます。
1.
初期間隔の設定:
ソート対象の数列の要素数 n を1.3で割り、小数点以下を切り捨てた値を初期の間隔 h とします。
2.
比較と交換: 数列のi番目の要素とi+h番目の要素を比較します。もしi+h番目の要素の方が小さければ、それらの要素を交換します。
3.
間隔の更新: 上記の比較と交換の操作を、i+hが数列の要素数 n を超えるまで繰り返します。
4.
間隔の縮小: 間隔 h を再び1.3で割り、小数点以下を切り捨てた値を新たな間隔 h とします。
5.
繰り返し: 間隔 h が1になるまで、ステップ2から4を繰り返します。間隔 h が1になった場合は、交換が発生しなくなるまでステップ2と3を繰り返します。
例として、次の数列を昇順に
ソートしてみましょう。
8 4 3 7 6 5 2 1
1.
初期設定: この数列の要素数 n は8なので、初期の間隔 h は 8 / 1.3 ≒ 6 となります。
2.
間隔h=6: 8と2、4と1を比較し、交換を行います。
8 4 3 7 6 5 2 1
2 4 3 7 6 5 8 1
2 1 3 7 6 5 8 4
3.
間隔h=4: 次に、間隔 h は 6 / 1.3 ≒ 4 になります。2と6、1と5、3と8、7と4を比較します。7と4のみ交換が発生します。
2 1 3 7 6 5 8 4
2 1 3 4 6 5 8 7
4.
間隔h=3, 2, 1: 同様の操作を間隔 h が 3, 2, 1 となるまで繰り返します。h=3とh=2では交換は発生しません。
h=3:交換なし
2 1 3 4 6 5 8 7
h=2:交換なし
2 1 3 4 6 5 8 7
h=1:交換3回
2 1 3 4 6 5 8 7
1 2 3 4 6 5 8 7
1 2 3 4 5 6 8 7
1 2 3 4 5 6 7 8
この例では、合計6回の交換で数列が昇順に
ソートされました。
改良版アルゴリズム:Comb sort 11
コム
ソートのさらなる高速化のために、「Comb sort 11」と呼ばれる改良版
アルゴリズムも存在します。この
アルゴリズムでは、間隔 h が9または10になった場合、強制的にhを11に設定します。これは、hが9→6→4→3→2→1や10→7→5→3→2→1と遷移するよりも、11→8→6→4→3→2→1と遷移する方が、より効率的に数列を「梳く」ことができるためです。
まとめ
コム
ソートは、バブル
ソートの欠点を克服し、より高速な
ソートを実現する
アルゴリズムです。その単純さと効率性から、様々な場面で利用されています。Comb sort 11のような改良版も存在し、さらなる高速化への探求も進んでいます。