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.

マージソート

マージソート(merge sort) は分割統治法に基づくソートアルゴリズム。配列を半分に分割して再帰的にソートし、2つのソート済み配列をマージ(併合)する。

計算量
最悪時間計算量O(nlog⁡n)O(n \log n)
平均時間計算量O(nlog⁡n)O(n \log n)
最良時間計算量O(nlog⁡n)O(n \log n)
空間計算量O(n)O(n)(補助配列が必要)

特徴

  • 安定ソート

  • 入力に依存しない安定した O(nlog⁡n)O(n \log n)

  • 外部ソート(ディスク上の大規模データ)に適用しやすい

  • Python の sorted() / list.sort() の内部は Timsort(マージソート + 挿入ソートの混合)

アルゴリズム

  1. 要素数が1になるまで再帰的に分割

  2. マージする:2つのソート済みリストを先頭から比較して小さい方を順に取り出す。

入力: [38, 27, 43, 3, 9, 82, 10]
出力: [3, 9, 10, 27, 38, 43, 82]
ランダム100件: OK

in-place マージソート(Bottom-up)

再帰を使わず、マージ幅を 1 → 2 → 4 → ... と倍増させながらボトムアップで処理する。補助配列は使うが再帰スタックが不要。

[3, 9, 10, 27, 38, 43, 82]

応用:転倒数の計算

転倒数(inversion count) とは配列の中で i<ji < j かつ a[i]>a[j]a[i] > a[j] となるペアの個数。マージソートのマージ操作中にカウントできる。計算量 O(nlog⁡n)O(n \log n)。