Vous êtes sur la page 1sur 4

Informatique

Cours 4.2

Tri rapide (quick sort)

La mthode de tri rapide est base sur la division de liste en 2 parties non gales priori (algorithme du
type "diviser pour rgner").

1 Principe du tri rapide (quick sort)


On applique la mthode diviser pour rgner :
- On choisit un lment pivot p (1 er lment de la liste par exemple)
- On spare les lments du tableau t en deux groupes (pas ncessairement de mme taille).
o G1 = les lments x p.
o G2 = les lments x > p.
- On place p dans sa position dfinitive : t = [G1 , p, G2]
- On rpte ensuite rcursivement les oprations prcdentes chaque groupe dlments
gnr,
- A la fin des appels rcursifs, le tableau t est tri.

Figure 1 : principe du tri rapide avec pivot choisi en 1re position de liste.

Remarque : le pivot peut tre le 1er lment, le dernier, la mdiane ou une valeur alatoire (mais la
recherche du pivot optimal peut gnrer plus d'instructions qu'il n'en fait conomiser).

Lyce Jules Ferry Cannes

Page 1 sur 4

TSI2

Informatique

Cours 4.2

Tri rapide (quick sort)

2 Tri rapide en place


Le tri rapide peut tre effectu en place en utilisant un indice m qui indique la place finale du pivot et
donc l'indice du dernier lment de G1 (borne exclus) et l'indice du dbut des lments du groupe G2
(borne exclus).
Exemple avec une squence entre i et j (on prend i=0 pour simplifier les critures mais cela fonctionne
de la mme faon pour toute valeur de i si on prend comme valeur initiale m = i et k=i+1 o k est l'indice
d'un lment du tableau hors pivot plac en i) :
Initialisation

m=i =0;

pivot enT[i] : p=5

k=1

m=0

k=1

j=5
3

pivot (gris fonc)


Premire itration (k=1)
T[1]=8> p=5

m=1

change T[m] et T[k]

m =2

lment G2
k=2
3

m=1

k=2

m=2

k=3

m=2

k=3

4e itration (k=4)

lment G1 ( changer)

m=2
5

T[k]=9> p=5

i=0
change T[m] et T[k]

m=1

3e itration (k=3)
T[k]=2 p=5

lments grouper (blanc)

2e itration (k=2)
T[k]=3 p=5

Placement du pivot

i=0

change T[0] et T[m]

G1 ( resegmenter)

k=4
8

m=2
3

k=4
8

pivot (tri)

j=5

9
G2 ( resegmenter)

Figure 2 : volution du tri pour l'algorithme de partition du tableau (pivot gauche).

Lyce Jules Ferry Cannes

Page 2 sur 4

TSI2

Informatique

Cours 4.2

Tri rapide (quick sort)

3 Algorithme
L'algorithme de segmentation est le suivant.
Donnes :

T : un tableau de valeurs numriques [0..n-1]


i, j : les indices de dbut et de fin de la segmentation effectuer (j exclus)
Rsultat : le tableau T segment avec le pivot sa place dfinitive, lindice de la place du pivot
Segmenter(T,i,j)
pT[i]

# p : pivot du segment = 1er lment de la liste grouper


mi
# m : indice de sparation entre G1 (valeurs p) et G2 (valeurs>p)
Pour k variant entre i+1 et j-1 faire
# rpter tant que tous les lments n'ont t lus
SiT[k]<=p faire

# si T[k] appartient G1

mm+1
Echange(T,m,k)
Fin Si
Fin Pour
Echange(T,i,m) # placer le pivot sa place : indice m (l'lment initialement en m reste dans G1)
Retourner m
Fin Segmenter
Pour effectuer le tri partir de cette fonction segmenter, on dfinit un deuxime algorithme rcursif.
Donnes :

T : un tableau de valeurs numriques [0..n-1]


i, j : les indices de dbut et de fin de tri effectuer (j exclu)
Rsultat : le tableau T tri entre les indices i et j compris
Tri_rapide(T,i,j)
Si i < j alors
m = Segmenter(T,i,j)
Tri_rapide(T,i,m)
# m est l'indice de la dernire valeur (m exclu)
Tri_rapide(T,m+1,j)
# j est l'indice de la dernire valeur (j exclu)
Fin Si
Retourner T
Fin Tri_rapide
L'instruction suivante permet de trier la liste t0=[5, 8, 3, 2, 9] pour un fonction programme en python :
>>> Tri_rapide(t0,0,len(t0))
[2, 3, 5, 8, 9]

Lyce Jules Ferry Cannes

Page 3 sur 4

TSI2

Informatique

Cours 4.2

Tri rapide (quick sort)

4 Performances des algorithmes


Complexit
Le cot temporel de lalgorithme de tri est principalement donn par des oprations de comparaison
sur les lments trier.
On raisonne dans la suite sur le nombre de donnes traiter pour lanalyse de la complexit de
lalgorithme.
- Dans le pire des cas, un des deux segments est vide chaque appel de la fonction segmenter.
Cela arrive lorsque le tableau est dj tri.
Le nombre de donnes traiter pour le ie appel, est n i.
Le nombre total pour n appels de fonction est donc
(relation de rcurrence du type
C(n) = C(n-1) + n 1).
La complexit est donc de classe quadratique C(n) = O(n).
- Dans le meilleur des cas, les deux segments sont de taille gale. Pour un nombre de donnes
traiter n, chacun des segments suivant a donc au plus
lments (on retire le pivot). Il faut n-1
itrations pour raliser la partition ncessaire au rang suivant n.
On peut ainsi crire une relation de rcurrence du type
= 1 + 2
.
La complexit est donc de classe quasi linaire C(n)=O(n.log(n)) (voir annexes du cours 2).
Bilan des complexits temporelle du tri rapide
meilleur des cas pire cas
comparaisons n.log(n)
n
affectations
n.log(n)
n
L'algorithme de tri rapide a donc des performances comparables au tri par insertion du point de vue des
complexits.
En pratique
Liste non trie
L'algorithme de tri rapide est plus rapide lorsque la probabilit de se trouver dans le pire des cas est
alatoire (liste pas du tout trie).
Liste trie
Par contre l'algorithme de tri par insertion reste plus rapide pour des listes quasi-tries.
L'algorithme de tri rapide est peine fonctionnel sur spyder pour une liste quasi-trie (avec
position du pivot en dbut de tableau) car les limites des appels rcursifs sont rapidement atteintes
(n1000).
Une solution pour gagner en rapidit (et en nombres d'appels rcursifs) avec le tri rapide est
paradoxalement de choisir des pivots des positions alatoires dans chaque partition. Il faut ensuite
changer le pivot obtenu avec le premier lment du tableau afin de retomber sur les algorithmes
prcdents (pivot gauche).

Ressources :
Damien Broizat
Patrick Beynet UPSTILyce Jules Ferry Cannes

Page 4 sur 4

TSI2

Vous aimerez peut-être aussi