O Quicksort é descrito como "no local", mas usando uma implementação como:
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
Você precisa criar uma cópia da lista para cada recursão. No primeiro retorno, na memória, temos:
- matriz
- maior + igual + menos
Então, pela segunda recursão em todas as sub-listas, temos:
- matriz
- maior, igual, menor desde a primeira recursão
- maior + igual + menor de menor1, maior + igual + menor de maior1
etc ...
É apenas um código mal escrito ou estou correto ao pensar que, para uma grande lista, você realmente precisa ter, proporcionalmente, uma quantidade razoável de espaço extra para armazenar esses itens?
Quando penso em algo "in-loco", penso na classificação de bolhas, que simplesmente troca elementos da lista como: http://en.wikipedia.org/wiki/File:Bubble-sort-example-300px. gif
O BubbleSort requer apenas 1 variável extra para armazenar um elemento potencialmente trocado.