Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

挿入ソート

挿入ソート(insertion sort) は未ソートの要素を1つずつ取り出し、ソート済み部分の適切な位置に挿入するアルゴリズム。トランプの手札を並べるイメージ。

計算量
最悪時間計算量O(n2)O(n^2)(逆順入力)
平均時間計算量O(n2)O(n^2)
最良時間計算量O(n)O(n)(ほぼソート済み)
空間計算量O(1)O(1)(in-place)

特徴

  • 安定ソート

  • in-place

  • ほぼソート済みのデータに非常に効率的

  • 小さい配列(n≲20n \lesssim 20)では定数係数が小さく実用的に速い(Timsort などの内部で使用)

アルゴリズム

  1. インデックス i = 1 から開始し、arr[i] を key として取り出す

  2. ソート済み部分 arr[0:i] で key より大きい要素を1つ右にシフトする

  3. 空いた位置に key を挿入する

  4. i を進めて繰り返す

入力: [12, 11, 13, 5, 6]
出力: [5, 6, 11, 12, 13]
ほぼソート済み100件: OK
ランダム20件: OK

ステップ可視化

入力: [5, 3, 8, 1, 4]
i=1, key=3: [3, 5, 8, 1, 4]
i=2, key=8: [3, 5, 8, 1, 4]
i=3, key=1: [1, 3, 5, 8, 4]
i=4, key=4: [1, 3, 4, 5, 8]
[1, 3, 4, 5, 8]

二分探索による改良

挿入位置を線形探索ではなく二分探索で求めることで比較回数を O(nlog⁡n)O(n \log n) に削減できる。ただしシフト操作は O(n2)O(n^2) のままなので、時間計算量全体は変わらない。

[1, 3, 4, 5, 8]