コンピュータサイエンスにおいて、マージ挿入ソートまたはフォード・ジョンソンアルゴリズムは、 1959年にLRフォード・ジュニアとセルマー・M・ジョンソンによって発表された比較ソートアルゴリズムです。[ 1 ] [ 2 ] [ 3 ] [ 4 ]このアルゴリズムは、最悪の場合でも、それまで知られていた最良のアルゴリズムであるバイナリ挿入ソートやマージソートよりも比較回数が少なく、[ 1 ] 20年間、最も比較回数の少ないソートアルゴリズムとして知られていました。[ 5 ]実用的な重要性はありませんが、最小の比較回数でソートを行う問題との関連で理論的な関心を集めています。[ 3 ]同じアルゴリズムがスタニスワフ・トリブラとチェン・ピンによっても独立に発見された可能性があります。[ 4 ]
ランダム化された値の配列をソートするマージ アルゴリズムのアニメーション。アルゴリズム
マージ挿入ソートは、要素の入力に対して以下のステップを実行する。 [ 6 ]

- の要素を任意に要素のペアにグループ化します。要素の数が奇数の場合は、1 つの要素をペアにしないままにします。


- ペアごとに 1 つずつ比較を実行し、各ペアの 2 つの要素のうち大きい方を決定します。

- マージ挿入ソートを使用して、各ペアの大きい要素を再帰的にソートし、入力要素の昇順のソートされたシーケンスを作成します。



- の最初の最小の要素とペアになった要素の先頭に挿入します。


- の残りの要素を、以下に説明する挿入順序に従って、1つずつ に挿入します。 の部分列に対して二分探索(以下に説明する)を用いて、各要素を挿入する位置を決定します。




このアルゴリズムは、探索される部分列の長さが2のべき乗より1小さい場合に、要素を に挿入するために使用されるバイナリ検索が最も効率的である(最悪ケース分析の観点から)という事実を利用するように設計されている。これは、これらの長さでは、探索のすべての結果が互いに同じ数の比較を使用するためである。[ 1 ]これらの長さを生成する挿入順序を選択するには、上記の概要のステップ4の後(残りの要素を挿入する前)のソートされたシーケンスを考慮し、このソートされたシーケンスの 番目の要素を とします。したがって、 




ここで、 の各要素は、まだ挿入されていない要素とペアになっています。(と がペアになっているため、や の要素は存在しません。) が奇数の場合、残りのペアになっていない要素も、 がペアになっている要素のインデックスよりも大きいとして番号付けされます。そして、上記の概要の最後のステップは、以下のステップに展開できます。[ 1 ] [ 2 ] [ 3 ] [ 4 ]









- 挿入されていない要素を連続したインデックスを持つグループに分割します。最初のグループには2つの要素とがあり、隣接する2つのグループのサイズの合計は2の累乗の列を形成します。したがって、グループのサイズは2、2、6、10、22、42、…となります。



- 挿入されていない要素をグループ(小さいインデックスから大きいインデックスへ)順に並べますが、各グループ内では大きいインデックスから小さいインデックスへ並べます。したがって、順序は次のようになります。

- この順序を使用して、要素を に挿入します。各要素について、 の先頭から まで(ただし は含みません)のバイナリ検索を使用して、 を挿入する場所を決定します。






分析
マージ挿入ソートが最悪のケースで要素をソートする際に行う比較回数を とします。この比較回数は、以下の3つの項の合計として分解できます。 

アイテムのペア間の比較、
再帰呼び出しの比較、および- 残りの要素を挿入するために使用されるバイナリ挿入の比較がいくつか行われます。
第 3 項では、最初のグループの要素の比較回数の最悪ケースは 2 回です。これは、各要素が最大で長さ 3 の の部分列に挿入されるためです。まず、が 3 要素の部分列 に挿入されます。次に、が 3 要素の部分列 の何らかの順列、または場合によっては 2 要素の部分列 に挿入されます。同様に、2 番目のグループの要素と はそれぞれ、3 回の比較を使用して、最大で長さ 7 の部分列に挿入されます。より一般的には、番目のグループの要素の比較回数の最悪ケースは 回です。これは、各要素が最大で長さ の部分列に挿入されるためです。[ 1 ] [ 2 ] [ 3 ] [ 4 ]すべての要素に使用された比較回数を合計し、結果として得られる再帰関係を解くことで、 の値を計算するためにこの分析を使用でき、式[ 7 ]が得られます。












あるいは、閉じた形では、[ 8 ]

比較の数は[ 1 ]
- 0、1、3、5、7、10、13、16、19、22、26、30、34、...(OEISのシーケンスA001768)
他の比較ソートとの関係
このアルゴリズムは、再帰呼び出しの前に行う初期比較(任意の項目をペアにして各ペアを比較する)がマージソートの初期比較と同じであるのに対し、再帰呼び出し後に行う比較(二分探索を使用して要素を1つずつソート済みリストに挿入する)は挿入ソートと同じ原理に従うため、マージ挿入ソートと呼ばれます。この意味で、これはマージソートと挿入ソートの両方を組み合わせたハイブリッドアルゴリズムです。[ 9 ]
入力が小さい場合( まで)、その比較回数は比較ソートの下限に等しくなります。しかし、入力が大きい場合、マージ挿入アルゴリズムによる比較回数はこの下限よりも大きくなります。マージ挿入ソートは、最悪のケースでバイナリ挿入ソートやマージソートによって行われる比較を数えるソート回数よりも少ない比較を実行します。ソート回数は と の間で変動し、上位項は同じですが、下位線形項の定数係数は悪化します。[ 1 ]



マージ挿入ソートは、の場合にアイテムの比較が最小限に抑えられるソートアルゴリズムであり、 の場合に知られている比較回数が最も少ない。[ 10 ] [ 11 ] 20年間、マージ挿入ソートは、あらゆる入力長に対して知られている比較回数が最も少ないソートアルゴリズムだった。しかし、1979年にGlenn Manacherは、十分に大きな入力に対して、さらに比較回数が少ない別のソートアルゴリズムを発表した。[ 3 ] [ 5 ] すべての に対してソートに必要な比較回数が正確にいくつなのかは不明だが、Manacherのアルゴリズムとその後の記録破りのソートアルゴリズムはすべて、マージ挿入ソートの考え方の修正版を使用している。[ 3 ]



参考文献