Pythonでマージソートを実装する方法を徹底解説!サンプルコード付き
この記事では、マージソート(Merge Sort)のアルゴリズムを使って配列を並べ替えるPythonプログラムについて、実際のコード例を交えながら詳しく解説します。
問題設定
課題 − 与えられた配列を、マージソートの考え方を用いて昇順に並べ替えます。
マージソートは分割統治法に基づく整列アルゴリズムです。まず配列を半分ずつ再帰的に分割し、要素が1つになった時点でそれを「ソート済み」とみなします。その後、隣り合う部分配列同士を先頭から比較しながら統合(マージ)していくことで、最終的に配列全体が整列されます。
Pythonでの実装例
# マージ関数
def merge(arr, l, m, r):
n1 = m - l + 1
n2 = r - m
# 一時配列を作成
L = [0] * (n1)
R = [0] * (n2)
# データを一時配列へコピー
for i in range(0, n1):
L[i] = arr[l + i]
for j in range(0, n2):
R[j] = arr[m + 1 + j]
i = 0 # 前半部分のインデックス
j = 0 # 後半部分のインデックス
k = l # 統合後の書き込み位置
while i < n1 and j < n2:
if L[i] <= R[j]:
arr[k] = L[i]
i += 1
else:
arr[k] = R[j]
j += 1
k += 1
# 左半分に残った要素をコピー
while i < n1:
arr[k] = L[i]
i += 1
k += 1
# 右半分に残った要素をコピー
while j < n2:
arr[k] = R[j]
j += 1
k += 1
# ソート本体
def mergeSort(arr, l, r):
if l < r:
# 中央位置を計算
m = (l + r) // 2
# 再帰的に分割してソート
mergeSort(arr, l, m)
mergeSort(arr, m + 1, r)
merge(arr, l, m, r)
# メイン処理
arr = [2, 5, 3, 8, 6, 5, 4, 7]
n = len(arr)
mergeSort(arr, 0, n - 1)
print("Sorted array is")
for i in range(n):
print(arr[i], end=" ")
実行結果
Sorted array is 2 3 4 5 5 6 7 8
プログラムのポイント
merge関数の役割
merge関数は、左半分(L)と右半分(R)という2つのソート済み部分配列を受け取り、それらを1つの整列済み配列に統合します。L[i]とR[j]の値を比較し、小さい方から元の配列arrへ順番に書き戻していきます。どちらか一方を使い切った後は、残りの要素をそのままコピーすれば完了です。
mergeSort関数の役割
mergeSort関数は再帰的に呼び出され、配列の中央位置mを求めて左右に分割します。範囲が1要素以下になると再帰が止まり、呼び出し元へ戻る過程でmerge関数によって順次統合されていきます。
なお、中央位置の計算には(l + r) // 2を使用しています。Python 3では「/」は小数を含む除算(float)となるため、リストのインデックスとして使うには整数除算の「//」を使う必要があります。
変数のスコープ
このプログラムで使われるすべての変数はローカルスコープで宣言されています。各関数内で定義された変数(L、R、i、j、kなど)は、関数の外部からは参照できない点に注意してください。
マージソートの計算量
マージソートの計算量は、入力データの初期状態に関わらず常にO(n log n)です。また、同じ値の相対的な順序が保たれる「安定なソート」である点も大きな特徴です。一方で、統合時に一時配列が必要となるため、追加のメモリ領域としてO(n)を必要とします。
まとめ
この記事では、Pythonでマージソートを実装する方法を学びました。「分割して統合する」というシンプルな発想でありながら、常に高速かつ安定した性能を発揮できるのがマージソートの魅力です。ぜひ実際にコードを動かして、挙動を確認してみてください。
-
Pythonで選択ソートを実装する方法|仕組みとサンプルコードをわかりやすく解説
この記事では、選択ソート(Selection Sort)の基本的な仕組みと、Python 3.x(およびそれ以前のバージョン)での実装方法について解説します。 選択ソートとは 選択ソートは、ソートされていない部分から最小の要素を繰り返し見つけ出し、先頭側へ移動させることで配列全体を整列していくアルゴリズムです。処理の過程で、対象の配列は次の2つの部分配列に分けられます。 すでにソートが完了している部分配列 まだソートされていない部分配列 選択ソートの各イテレーションでは、未ソートの部分配列から最小要素を取り出し、ソート済みの部分配列の末尾に追加していきます。 アルゴリズムの動作イメー
-
Pythonで学ぶ挿入ソート(Insertion Sort)の仕組みと実装方法
この記事では、Python 3.xにおける挿入ソート(Insertion Sort)の基本的な考え方と、実際のコードによる実装方法をわかりやすく解説します。 挿入ソートのアルゴリズム 挿入ソートは、配列を「整列済みの部分」と「未整列の部分」に分け、未整列の要素を一つずつ取り出して、整列済み部分の正しい位置に挿入していくシンプルなソート手法です。処理の手順は以下の通りです。 1. 各反復ごとに整列済みの配列を少しずつ拡大しながら、入力要素を走査する。 2. 現在の要素(キー)を、整列済み配列内の最大値と比較する。 3. キーがその最大値より大きければ、要素はそのままの位置に置かれ、 次の要