Les affichages choisis sont faits après chaque exécution de la fonction partition.
On voit ainsi dans quel ordre les segments de listes sont traités.
from random import randint
def partitionDessusDessous(liste, debut, fin) :
pivot = liste[debut]
gauche = debut+1
droit = fin
while gauche <= droit :
while gauche <= droit and liste[gauche] <= pivot :
gauche +=1
while gauche <= droit and liste[droit] > pivot :
droit -= 1
if gauche < droit :
liste[gauche], liste[droit] = liste[droit], liste[gauche]
gauche += 1
droit -= 1
liste[debut], liste[gauche-1] = liste[gauche-1], liste[debut]
# on retourne la position finale du pivot :
return gauche-1
def affiche(liste, d, f, indice_pivot) :
print()
for x in liste :
print(x, end=' ')
print()
for i in range(len(liste)) :
if i == d :
print('deb', end=' ')
elif i == f :
print('fin', end=' ')
elif i == indice_pivot :
print('piv',end=' ')
else :
print(' ', end=' ')
print()
for i in range(len(liste)) :
if i == d and d == indice_pivot :
print('piv', end=' ')
elif i == f and f == indice_pivot :
print('piv',end=' ')
else :
print(' ', end=' ')
print()
print("*" * 4*len(liste))
print()
def quicksort(liste) :
def trirapide(d, f) :
if d < f:
indice_pivot = partitionDessusDessous(liste, d, f)
affiche(liste, d, f, indice_pivot)
trirapide(d, indice_pivot-1)
trirapide(indice_pivot+1, f)
trirapide(0, len(liste)-1)
L = [ randint(100, 999) for _ in range(randint(5,15)) ]
print("Liste avant le tri : ", L)
quicksort(L)
print("Liste après le tri : ", L)
On obtient par exemple :
Liste avant le tri : [211, 188, 283, 108, 499, 195, 701, 753, 116, 265, 424, 676, 981]
195 188 116 108 211 499 701 753 283 265 424 676 981
deb piv fin
****************************************************
108 188 116 195 211 499 701 753 283 265 424 676 981
deb fin
piv
****************************************************
108 188 116 195 211 499 701 753 283 265 424 676 981
deb fin
piv
****************************************************
108 116 188 195 211 499 701 753 283 265 424 676 981
deb fin
piv
****************************************************
108 116 188 195 211 283 424 265 499 753 701 676 981
deb piv fin
****************************************************
108 116 188 195 211 265 283 424 499 753 701 676 981
deb piv fin
****************************************************
108 116 188 195 211 265 283 424 499 676 701 753 981
deb piv fin
****************************************************
108 116 188 195 211 265 283 424 499 676 701 753 981
deb fin
piv
****************************************************
Liste après le tri : [108, 116, 188, 195, 211, 265, 283, 424, 499, 676, 701, 753, 981]
Liste avant le tri : [687, 467, 561, 907, 197]
197 467 561 687 907
deb piv fin
********************
197 467 561 687 907
deb fin
piv
********************
197 467 561 687 907
deb fin
piv
********************
Liste après le tri : [197, 467, 561, 687, 907]
Liste avant le tri : [329, 615, 615, 866, 258, 279, 826, 283, 292, 360, 884, 309, 911, 403]
279 309 292 283 258 329 826 866 615 360 884 615 911 403
deb piv fin
********************************************************
258 279 292 283 309 329 826 866 615 360 884 615 911 403
deb piv fin
********************************************************
258 279 283 292 309 329 826 866 615 360 884 615 911 403
deb piv fin
********************************************************
258 279 283 292 309 329 615 403 615 360 826 884 911 866
deb piv fin
********************************************************
258 279 283 292 309 329 360 403 615 615 826 884 911 866
deb fin
piv
********************************************************
258 279 283 292 309 329 360 403 615 615 826 884 911 866
deb fin
piv
********************************************************
258 279 283 292 309 329 360 403 615 615 826 884 911 866
deb fin
piv
********************************************************
258 279 283 292 309 329 360 403 615 615 826 866 884 911
deb piv fin
********************************************************
Liste après le tri : [258, 279, 283, 292, 309, 329, 360, 403, 615, 615, 826, 866, 884, 911]