Pythonでクイックソートを実装する方法|初心者向けにサンプルコードを徹底解説
この記事では、クイックソート(QuickSort)のアルゴリズムを使って配列を並べ替えるPythonプログラムの実装方法を、初心者にもわかりやすく解説します。
問題の定義
問題: 与えられた配列を、クイックソートの考え方を利用して昇順にソートすることです。
クイックソートは「分割統治法」と呼ばれる手法に基づく高速なソートアルゴリズムです。まず配列を基準値(ピボット)を境目に2つの部分に分割し、それぞれの部分配列を再帰的にソートしていくことで、最終的に全体が整列された配列を得られます。
クイックソートの仕組み
処理の流れは以下のとおりです。
- 配列からピボット(基準となる要素)を選びます。ここでは末尾の要素をピボットとしています。
- ピボットより小さい要素を左側へ、大きい要素を右側へ移動させます(パーティション処理)。
- ピボットの位置が確定したら、その左右の部分配列に対して同じ操作を再帰的に繰り返します。
- 部分配列のサイズが1以下になれば、その時点で整列済みとみなし処理を終了します。
Pythonでの実装例
それでは、実際のコードを見ていきましょう。
# パーティション関数(配列を分割する)
def partition(arr, low, high):
i = (low - 1)
pivot = arr[high] # ピボットとして末尾の要素を選択
for j in range(low, high):
# 現在の要素がピボット以下の場合
if arr[j] <= pivot:
i = i + 1
arr[i], arr[j] = arr[j], arr[i]
arr[i + 1], arr[high] = arr[high], arr[i + 1]
return (i + 1)
# クイックソート本体(再帰的にソートする)
def quickSort(arr, low, high):
if low < high:
# パーティションの基準位置を取得
pi = partition(arr, low, high)
# 左右の部分配列をそれぞれソート
quickSort(arr, low, pi - 1)
quickSort(arr, pi + 1, high)
# メイン処理
arr = [2, 5, 3, 8, 6, 5, 4, 7]
n = len(arr)
quickSort(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
コードのポイント解説
partition 関数では、変数 i が「ピボットより小さい要素群の境界」を表しています。ループの中で arr[j] がピボット以下であれば i を進めて要素を交換することで、小さい要素が徐々に左側へ集まっていきます。ループ終了後、ピボットを正しい位置(i+1)に移動させ、そのインデックスを返します。
quickSort 関数は、返されたインデックス pi を基準に、左側(low〜pi-1)と右側(pi+1〜high)の部分配列に対して自分自身を呼び出す再帰構造になっています。これにより、すべての要素が確定するまで分割と整列が繰り返されます。
なお、このプログラムで使われている変数はすべてローカルスコープ内で宣言されており、各再帰呼び出しの中で独立して管理されます。
計算量について
クイックソートの平均計算量は O(n log n) と非常に効率的ですが、最悪の場合(すでにソート済みの配列などで常に偏った分割が起こるケース)には O(n²) まで悪化する可能性があります。ピボットの選び方を工夫することで、このリスクを軽減できます。
まとめ
この記事では、Pythonを使ってクイックソートを実装する方法を学びました。パーティション処理と再帰呼び出しという2つの重要な概念を理解すれば、クイックソートのロジックはシンプルに記述できます。ぜひ自分でもコードを動かしながら、動作の流れを確認してみてください。
-
Pythonで単利を計算するプログラムの作成方法
この記事では、Python 3.x(およびそれ以前のバージョン)を使用して、単利を計算する方法について解説します。単利とは、元本に対して一定の利率で発生する利息のことです。一般的には、利率に元本を掛け、さらに利息が発生する期間を掛けることで求められます。単利の計算式単利は数学的に以下の式で表すことができます。単利(SI) = (P × T × R) / 100 P:元本(Principal) T:期間(Time) R:利率(Rate)例えば、元本 P = 1000、利率 R = 1%、期間 T = 2 の場合、単利は次のように計算されます。SI = (1000 × 1 × 2) / 100
-
Pythonで選択ソートを実装する方法|仕組みとサンプルコードをわかりやすく解説
この記事では、選択ソート(Selection Sort)の基本的な仕組みと、Python 3.x(およびそれ以前のバージョン)での実装方法について解説します。 選択ソートとは 選択ソートは、ソートされていない部分から最小の要素を繰り返し見つけ出し、先頭側へ移動させることで配列全体を整列していくアルゴリズムです。処理の過程で、対象の配列は次の2つの部分配列に分けられます。 すでにソートが完了している部分配列 まだソートされていない部分配列 選択ソートの各イテレーションでは、未ソートの部分配列から最小要素を取り出し、ソート済みの部分配列の末尾に追加していきます。 アルゴリズムの動作イメー