0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

マージソート:NlogNについて簡単な数学的導出をしてみた

Posted at

マージソートの計算量の導出を簡易的に行う記事です

「マージソートって $O(N log N)$ らしいけど、
なぜそうなるのかを “自分の言葉で説明できるか?” と聞かれると、ちょっと自信がない。

そんな人のための記事です。

私自身、マージソートの仕組みを見て、「対数と何の関連性があるんだ?」と疑問に思い気になって仕方がなくなったので、平易な数学を用いて導出したいと思います。

マージ操作(merge)をまず理解しよう

マージソートの “核” は マージ(merge)操作 です。
これは 「ソート済みの2つの配列を、1つのソート済み配列に結合する処理」 のこと。

ここさえ理解すれば、マージソートへの理解が半分終わったようなものです。


マージ操作の直感的なイメージ

2 つのソート済み配列 A [1,3] と B [2,4]があるとします。
スクリーンショット 2025-11-15 20.46.34.png

目標はこの二つの配列を合併して、新たなソートされた配列[1,2,3,4]を作ることです。

やることはシンプルで、

  1. A の先頭と B の先頭(各配列の最小要素)を比べる
  2. 小さい方を結果配列に入れる
  3. その配列のポインタを1つ進める
  4. どちらかが尽きるまで繰り返す
  5. 残った方を全部くっつける

これだけです。


実際の手順の図(イメージ)

まずは。Aの先頭の要素である1と2を比べます。
スクリーンショット 2025-11-15 21.00.50.png
比べて小さい方の1を合併後の配列の先頭に入れます。

次に、残った[3]と[2,4]で再度先頭要素を比べます。
スクリーンショット 2025-11-15 21.03.41.png
比べて小さい方の2を合併後の配列に追加します。

これを続けていくと最終的にソートされた合併後の配列[1,2,3,4]が得られることは理解できると思います。

マージソートとは何か(全体像をつかむ)

マージソート(Merge Sort)は
「分割して、並べて、マージする」 というシンプルな戦略を持つソートアルゴリズムです。

ポイントはこの 3 つ:

  1. 配列を半分に 分割
  2. 小さく分割した配列をそれぞれ 再帰的にソート
  3. ソート済みの2つの配列を マージ操作 する

といった流れになります。

全体の流れを直感で理解する

スクリーンショット 2025-11-15 21.26.10.png

半分に分割したものを再帰的にソートするので、半分に分割する行為を繰り返していきます。
最終的に一つずつの配列になったものを、どんどんマージ操作していくイメージです。
スクリーンショット 2025-11-15 21.38.08.png
では、次はこれを実際に数式に落とし込んでいきましょう。

全体の流れを数式で理解する

まず、ソートしたい配列の要素数を$N=2^k$(今回は簡易的に導出するため)とし、計算回数を求めます。

  1. 配列を半分に 分割
  2. 小さく分割した配列をそれぞれ 再帰的にソート
  3. ソート済みの2つの配列を マージ操作 する

この操作をその配列に行なっていきます。

半分にする分割回数は要素数が$2^k$であるため、$k$回です。(e.g., $4=2^2$は分割回数2回
分割した配列に対してマージ操作を行う際の比較回数は、すべて$N$回以下になります。これは分割した配列の要素数が$N$より大きいことが無いことから簡単に分かります。
スクリーンショット 2025-11-15 22.50.18.png
$N=2^3=8$の例で見ると、分割回数は3回で各レイヤーの比較回数は8回以下なので、ざっくり計算量は$3*8$に抑えられることが分かるでしょう。
したがって、これを$N=2^k$に一般化すれば計算回数は

\begin{align}
Nk=NlogN
\end{align}
\begin{align}
k = \log_2 N⇔N=2^k
\end{align}

よって、欲しかった式を導出することができました。

まとめ(結論)

マージソートの計算量は $O(NlogN)$。
というのも、マージソートを二つの工程で分けると、

  1. 配列の分割は $log N$ 回

    • 半分 → 半分 → 半分… と再帰的に分割していくため
    • 分割の深さ(再帰の深さ)は $log_2 N$
  2. 各階層のマージ処理は合計で常に $N以下$

    • 同じ階層の部分配列で、マージ操作する回数は$N$以下
    • つまりどの階層でも作業量は $O(N)$で抑えられる

したがって、

\begin{align}
O(NlogN)
\end{align}

という計算量になります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?