クイックソートは「インプレース」と説明されていますが、次のような実装を使用しています。
def sort(array):
less = []
equal = []
greater = []
if len(array) > 1:
pivot = array[0]
for x in array:
if x < pivot:
less.append(x)
if x == pivot:
equal.append(x)
if x > pivot:
greater.append(x)
return sort(less) + equal + sort(greater)
else:
return array
再帰ごとにリストのコピーを作成する必要があります。最初の戻りまでに、メモリには次のようになります。
- アレイ
- 大きい+等しい+小さい
次に、すべてのサブリストにわたる2回目の再帰によって、次のようになります。
- アレイ
- 大きい、等しい、最初の再帰から少ない
- 大きい1から大きい+等しい+小さい大きい1から大きい+等しい+小さい
等...
これは単にひどく書かれたコードですか、それとも、大きなリストの場合、実際にそれらを格納するために相当量の余分なスペースが必要だと思いますか?
「インプレース」で何かを考えるとき、バブルソートを考えます。これは、http://en.wikipedia.org/wiki/File:Bubble-sort-example-300pxのようなリスト内の要素を単純に交換します。 gif
BubbleSortは、スワップされる可能性のある要素を格納するために1つの追加の変数のみを必要とします。