Quicksort wird als "an Ort und Stelle" beschrieben, verwendet jedoch eine Implementierung wie:
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
Sie müssen für jede Rekursion eine Kopie der Liste erstellen. Bei der ersten Rückkehr haben wir im Gedächtnis:
- Array
- größer + gleich + kleiner
Dann haben wir durch die zweite Rekursion über alle Unterlisten:
- Array
- größer, gleich, kleiner von der ersten Rekursion
- größer + gleich + kleiner von kleiner1, größer + gleich + kleiner von größer1
usw...
Ist das nur schlecht geschriebener Code oder habe ich Recht, wenn ich denke, dass Sie für eine große Liste tatsächlich proportional genügend zusätzlichen Speicherplatz benötigen, um diesen zu speichern?
Wenn ich an etwas denke, das "an Ort und Stelle" ist, denke ich an die Blasensortierung, bei der einfach Elemente in der Liste ausgetauscht werden, z. B .: Http://en.wikipedia.org/wiki/File:Bubble-sort-example-300px. gif
BubbleSort benötigt nur 1 zusätzliche Variable, um ein potenziell vertauschtes Element zu speichern.