Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで実装するストゥージソート:アルゴリズムの手順とコード例を徹底解説

本記事では、ストゥージソート(Stooge Sort)を用いて配列を並べ替えるPythonプログラムの実装方法について解説します。

問題文

与えられた配列を、ストゥージソートというアルゴリズムを使って昇順に並べ替えることが課題です。

ストゥージソートとは

ストゥージソートは、配列の一部を再帰的に繰り返しソートすることで全体を整列させる、非常にシンプルな比較ソートアルゴリズムです。計算量は O(nlog3/log1.5) ≒ O(n2.71) となり、バブルソートなどよりもさらに非効率ですが、再帰処理やアルゴリズム設計の仕組みを理解するための学習教材として知られています。

アルゴリズムの手順

1. 配列の先頭要素が末尾の要素より大きい場合、両者を交換する。
2. 配列の先頭から約2/3の部分を再帰的にソートする。
3. 配列の末尾から約2/3の部分を再帰的にソートする。
4. 確認のため、もう一度先頭側の2/3をソートする。

それでは、実際の実装を見ていきましょう。

実装例(Pythonコード)

def stoogesort(arr, l, h):
    if l >= h:
        return
    # 要素の交換
    if arr[l] > arr[h]:
        t = arr[l]
        arr[l] = arr[h]
        arr[h] = t
    # 要素数が3以上の場合
    if h-l+1 > 2:
        t = (int)((h-l+1)/3)
        # 先頭側の2/3をソート
        stoogesort(arr, l, (h-t))
        # 末尾側の2/3をソート
        stoogesort(arr, l+t, h)
        # 再度、先頭側の2/3をソート
        stoogesort(arr, l, (h-t))

# メイン処理
arr = [1,4,2,3,6,5,8,7]
n = len(arr)
stoogesort(arr, 0, n-1)
print ("Sorted sequence is:")
for i in range(0, n):
    print(arr[i], end = " ")

出力結果

Sorted sequence is:
1 2 3 4 5 6 7 8

コードの解説

関数 stoogesort(arr, l, h) は、配列 arr のインデックス l から h までの範囲を対象にソートを実行します。まず範囲の両端の要素を比較し、先頭が大きければ交換します。続いて、範囲の長さが3より大きい場合は、長さの1/3を t として求め、「前2/3 → 後2/3 → 再び前2/3」の順に再帰呼び出しを行うことで、範囲全体が整列される仕組みです。すべての変数はローカルスコープ内で宣言されており、関数外へ影響を与えません。

まとめ

本記事では、Pythonによるストゥージソートの実装方法を学びました。コードは非常に簡潔で再帰の動作を理解しやすい一方、計算量が大きいため実務での利用には向いていません。あくまで学習目的のアルゴリズムである点を押さえておきましょう。

  1. Pythonで選択ソートを実装する方法|仕組みとサンプルコードをわかりやすく解説

    この記事では、選択ソート(Selection Sort)の基本的な仕組みと、Python 3.x(およびそれ以前のバージョン)での実装方法について解説します。 選択ソートとは 選択ソートは、ソートされていない部分から最小の要素を繰り返し見つけ出し、先頭側へ移動させることで配列全体を整列していくアルゴリズムです。処理の過程で、対象の配列は次の2つの部分配列に分けられます。 すでにソートが完了している部分配列 まだソートされていない部分配列 選択ソートの各イテレーションでは、未ソートの部分配列から最小要素を取り出し、ソート済みの部分配列の末尾に追加していきます。 アルゴリズムの動作イメー

  2. Pythonで学ぶ挿入ソート(Insertion Sort)の仕組みと実装方法

    この記事では、Python 3.xにおける挿入ソート(Insertion Sort)の基本的な考え方と、実際のコードによる実装方法をわかりやすく解説します。 挿入ソートのアルゴリズム 挿入ソートは、配列を「整列済みの部分」と「未整列の部分」に分け、未整列の要素を一つずつ取り出して、整列済み部分の正しい位置に挿入していくシンプルなソート手法です。処理の手順は以下の通りです。 1. 各反復ごとに整列済みの配列を少しずつ拡大しながら、入力要素を走査する。 2. 現在の要素(キー)を、整列済み配列内の最大値と比較する。 3. キーがその最大値より大きければ、要素はそのままの位置に置かれ、 次の要