宿題の QuickSort アルゴリズムを自分で選んだ言語で実装する必要があり、Python を選びました。
講義中、QuickSort はインプレースで動作するため、メモリ効率が高いとのことでした。つまり、再帰のための入力配列の部分の追加コピーはありません。
これを念頭に置いて、Python で QuickSort アルゴリズムを実装しようとしましたが、すぐに、洗練されたコードを記述するには、再帰中に配列の一部を関数自体に渡す必要があることに気付きました。Python はこれを行うたびに新しいリストを作成するので、Python3 を使用してみました (nonlocal キーワードがサポートされているため)。以下は私のコメント付きのコードです。
def quicksort2(array):
# Create a local copy of array.
arr = array
def sort(start, end):
# Base case condition
if not start < end:
return
# Make it known to the inner function that we will work on arr
# from the outer definition
nonlocal arr
i = start + 1
j = start + 1
# Choosing the pivot as the first element of the working part
# part of arr
pivot = arr[start]
# Start partitioning
while j <= end:
if arr[j] < pivot:
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
i += 1
j += 1
temp = arr[start]
arr[start] = arr[i - 1]
arr[i - 1] = temp
# End partitioning
# Finally recurse on both partitions
sort(start + 0, i - 2)
sort(i, end)
sort(0, len(array) - 1)
今、私は仕事をうまくやったのか、それとも何かが足りないのか分かりません. 私は QuickSort のより Pythonic バージョンを作成しましたが、入力配列の一部を返し続け、それらを連結するため、その場で機能しません。
私の質問は、これはPythonでそれを行う方法ですか? Google と SO の両方を検索しましたが、QuickSort の真のインプレース実装が見つからなかったので、質問するのが最善だと思いました。