挿入
ソート(insertion sort)は、
ソートアルゴリズムの一つで、基本挿入法とも呼ばれます。この
アルゴリズムは、整列済みの
配列に対して、新しい要素を適切な位置に挿入していくというシンプルな考えに基づいています。
挿入
ソートの基本的な手順は以下の通りです。
1.
配列の先頭から順に要素を取り出します。
2. 取り出した要素を、すでに整列済みの部分
配列と比較します。
3. 適切な挿入位置を見つけ、その位置に要素を挿入します。
4. 挿入位置を確保するために、必要に応じて既存の要素を後ろにずらします。
5. すべての要素が整列されるまで、1〜4の操作を繰り返します。
具体例として、以下の
配列を昇順に
ソートする場合を考えます。
`[5, 2, 4, 6, 1, 3]`
1. 最初は`[5]`が整列済みとみなされます。次に`2`を挿入します。`5`よりも小さいので、先頭に挿入され、`[2, 5]`となります。
2. 次に`4`を挿入します。`2`より大きく、`5`より小さいので、`5`の前に挿入され、`[2, 4, 5]`となります。
3. `6`は`5`より大きいので、そのまま後ろに追加され、`[2, 4, 5, 6]`となります。
4. `1`は、整列済み部分の先頭よりも小さいので、`2`の前に挿入され、`[1, 2, 4, 5, 6]`となります。
5. 最後に`3`を挿入します。`2`より大きく、`4`より小さいので、`[1, 2, 3, 4, 5, 6]`となり、
ソートが完了します。
実装の容易さ:
アルゴリズムが単純なため、比較的簡単に実装できます。
小規模なデータに強い: データ量が少ない場合、
クイックソートやマージ
ソートなどの高度な
ソートアルゴリズムよりも高速に動作することがあります。
安定ソート: 同じ値の要素がある場合、それらの要素の順序を保つ安定な
ソートです。
インプレースアルゴリズム: 追加のメモリ領域をほとんど必要とせず、元の
配列内で
ソートを完了させることができます。
*
オンラインアルゴリズム: データが逐次的に入力される場合でも、並行して
ソート処理が可能です。
計算時間
挿入
ソートの時間計算量は、平均・最悪ケースともにO(n^2)です。これは、要素数がnの場合、比較回数や交換回数がnの2乗に比例して増加することを意味します。そのため、データ量が大きい場合には、
クイックソートやマージ
ソートなどのO(n log n)の
アルゴリズムに比べて効率が悪くなります。
ただし、挿入
ソートは、ほぼ整列済みのデータに対しては非常に高速に動作するという特徴があります。これは、挿入位置を探すための比較回数が少なくなるためです。また、連結リスト構造のデータを
ソートする場合には、要素の挿入が効率的に行えるため、
配列の場合よりも高速に動作します。
挿入
ソートの改良版として、二分挿入
ソートがあります。これは、挿入位置を
二分探索で効率的に見つけるようにしたものです。これにより、比較回数を減らすことができます。特にデータ量が多い場合に効果を発揮します。ただし、
二分探索の
アルゴリズムによっては不安定な
ソートになる可能性があるため、安定性を保つためには工夫が必要です。
まとめ
挿入
ソートは、実装が簡単で、小規模なデータやほぼ整列済みのデータに対しては高速に動作する
ソートアルゴリズムです。安定性やインプレース処理能力も備えています。ただし、データ量が大きい場合には、他の効率的な
アルゴリズムを検討するべきです。二分挿入
ソートのように、挿入
ソートを改良した
アルゴリズムも存在し、状況に応じて使い分けることが重要です。