Académique Documents
Professionnel Documents
Culture Documents
Exercice 1. On rappelle que les complexités en pire cas de l’algorithme de tri-fusion ( MergeSort, J. von
Neumann 1945) et de l’algorithme de tri rapide ( QuickSort, C.A.R. Hoare 1960) sont respectivement en
O(n log n) et en O(n2 ) (tableau déjà trié). Montrer que leurs complexités en moyenne sont en O(n log n).
log
Xn n
Cmoy (n) = nCmoy (1) + 2i ( + 1).
i=0
2i
La complexité moyenne pour un tableau à un élément est constante. Notons c sa valeur (peu importe ce que
vaut c). On a donc
log
Xn
Cmoy (n) = cn + n(log n + 1) + 2i .
i=0
2log n+1 − 1
Cmoy (n) = (c + 1)n + n log n + .
2−1
On obtient donc finalement
Echange(T[premier],T[pivot]);
tant que i <= j faire
tant que (i <= j et T[i] < T[premier]) faire
-- on avance i jusqu’à ^
etre sur un élément plus grand que T[premier]
i := i+1;
fin tant que;
tant que (i <= j et T[j] > T[premier]) faire
-- on recule j jusqu’à ^etre sur un élément plus petit que T[premier]
j := j-1;
fin tant que;
si i < j alors
Echange(T[i],T[j]);
i := i+1;
j := j-1;
fin si;
-- on arr^ete quand i et j se croisent
fin tant que;
Echange(T[premier],T[j]);
-- T[1..j-1] et T[j+1..dernier] contiennent respectivement
-- les valeurs inférieures et supérieures à T[j]
retourner j;
fin fonction;
Notons n le nombre d’éléments du tableau : n = dernier − premier + 1. Dans la fonction Partition(), il y
a exactement n + 1 comparaisons entre un élément du tableau et T [premier], car on teste toutes les valeurs
de i et de j exactement une fois jusqu’à ce que i et j se croisent. La procédure QuickSort() étant récursive,
sa complexité en moyenne peut donc s’écrire :
d’où
n
2X
Cmoy (n) = n + 1 + Cmoy (p − 1)
n p=1
ou encore
n
X
nCmoy (n) = n(n + 1) + 2 Cmoy (p − 1), (4)
p=1
et donc
n−1
X
(n − 1)Cmoy (n − 1) = (n − 1)n + 2 Cmoy (p − 1). (5)
p=1
d’où
nCmoy (n) = 2n + (n + 1)Cmoy (n − 1),
ou encore en divisant par n(n + 1) :
Cmoy (n) Cmoy (n − 1) 2
= + . (6)
n+1 n n+1
Cette nouvelle équation de récurrence est beaucoup plus simple car on n’a plus de somme, et on peut en
déduire :
Cmoy (n − 1) Cmoy (n − 2) 2
= + . (7)
n n−1 n
On a donc, en combinant les équations (6) et (7) :
Cmoy (n) Cmoy (n − 2) 2 2
= + + .
n+1 n−1 n+1 n
En continuant ainsi, on obtient
n+1
Cmoy (n) Cmoy (1) X 2
= + ,
n+1 2 k
k=3
Remarque. Même si dans le pire cas le QuickSort est asymptotiquement plus coûteux en temps de cal-
cul que le MergeSort (O(n2 ) contre O(n log n)), on remarque qu’en moyenne les deux algorithmes ont un
comportement similaire (tout ceci, bien sûr, sous de bonnes conditions d’équiprobabilité). En pratique, on
constate même que le QuickSort est au moins 2 fois plus rapide que le MergeSort (voir notamment [1]). Ceci
est du au coût d’opérations autres que les comparaisons entre éléments de tableau, par exemple la recopie de
tableau du MergeSort. Les étudiants intéressés ou voulant s’exercer au calcul de complexités sont fortement
incités à se référer à [2].
Remarque. L’équation 1 est classique pour un algorithme qui applique le principe “Diviser pour Régner”.
Sa résolution l’est également. Nous y reviendrons à la fin du semestre.
Bibliographie indicative
[1] R. Sedgewick. Algorithmes en langage C : cours et exercices. Dunod, 2000.
[2] R. Sedgewick, P. Flajolet. Introduction à l’analyse des algorithmes. International Thomson Publishing
Company, 1996.
[1] est disponible à la B.U. Sciences et à la bibliothèque MI2S. [2] est disponible à la B.U. Sciences, et en
anglais à la bibliothèque MI2S.