IT基礎・コンピュータの用語一覧へ
このページの目次

マージソートとは?

読み方:マージソート

最終更新:2026/08/18

3秒でわかる

配列を半分ずつに分け、整列済みの列を併合して並べ替える手法。どんな並び順の入力でも速度が落ちず、同じ値どうしの順序も入れ替わりません。

30秒図解

マージソートは配列を1個ずつまで分け、整列済みの列を併合して、6個の値をO(n log n)で安定に並べ替える
マージソートは分割した列を小さい順に併合し、入力の並びに左右されない計算量と安定性を保ちます。

もう少し詳しく

どういうものか

マージソートは、配列を真ん中で 2 つに割る作業を要素が 1 個になるまで繰り返し、そこから 2 本ずつ突き合わせて小さいほうから取り出しながら 1 本に戻していく並べ替えです。要素 1 個の列はすでに整列済みとみなせるので、あとは「整列済みの 2 本を整列済みの 1 本にする」作業だけを繰り返せば全体が揃います。

なぜ必要か

計算量が常に O(n log n) で、データの並びに影響されない点が価値です。クイックソートは平均こそ速いものの、すでにほぼ整列済みの入力に対して選び方を誤ると O(n^2) まで落ちます。マージソートは最悪の場合でも同じ速度を保つため、応答時間を保証したい場面で選ばれます。同じ値の順序が入れ替わらない安定ソートである点も、複数条件で並べ替えるときに効いてきます。

具体例

def merge_sort(a): if len(a) <= 1: return a mid = len(a) // 2 left = merge_sort(a[:mid]) right = merge_sort(a[mid:]) return merge(left, right) def merge(left, right): out, i, j = [], 0, 0 while i < len(left) and j < len(right): if left[i] <= right[j]: out.append(left[i]); i += 1 else: out.append(right[j]); j += 1 return out + left[i:] + right[j:] print(merge_sort([5, 3, 8, 1, 9, 2]))

分割の様子は下のようになります。

[5,3,8,1] -> [5,3] [8,1] -> [5][3][8][1] 併合 -> [3,5] [1,8] -> [1,3,5,8]

つまずきやすいところ

併合の関数<=< に変えると、同じ値のとき右側を先に取るため安定性が失われます。見た目の結果は同じに見えるので、テストでも気付きにくい変更です。もうひとつはメモリで、この実装は元の配列とは別に同じ大きさの領域を使います。数百万件を扱う場面では、この追加領域が効いてくるため、その場で並べ替えるヒープソートが選ばれることもあります。

似た用語との違い

手法最悪計算量安定性追加メモリ
マージソートO(n log n)あり必要
クイックソートO(n^2)なしほぼ不要
ヒープソートO(n log n)なしほぼ不要

知識のつながり

サイドバーと同じ推奨ルート・関連語を、まとめて確認できます。

現在地マージソートIT基礎

LEARN BY DOING

この用語を、教材で使ってみる

直接関連する編と、その編を含むコースです。用語だけで終わらず、ブラウザ上で実際に手を動かせます。

この用語を扱うコース

コース

コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

135レッスン
コース

アルゴリズム道場 カメ師範の十の巻

10レッスン
コース

コンピューターサイエンス上級:アルゴリズムとデータ構造

50レッスン
コンピュータサイエンスコースの全編を見る