Professional Documents
Culture Documents
PARIS
MEMOIRE
POUR L'EXAMEN PROBATOIRE
en
INFORMATIQUE
par
Nicolas HERVE
JURY
PRESIDENTE : Mme COSTA
Sommaire
Introduction ................................................................................................................................ 3
1. Rappels sur l'analyse des algorithmes .................................................................................... 4
1.1 Qu'est-ce qu'un algorithme ? ............................................................................................ 4
1.2 Analyse de l'efficacit d'un algorithme ............................................................................ 5
2. Les principaux algorithmes de tri........................................................................................... 7
2.1 Le problme du tri ............................................................................................................ 7
2.2 Les tris par comparaison .................................................................................................. 8
2.3 Tri par insertion................................................................................................................ 9
2.4 Diviser pour rgner......................................................................................................... 11
2.5 Tri rapide ........................................................................................................................ 12
2.5.1 Version standard...................................................................................................... 12
2.5.2 Version alatoire ..................................................................................................... 14
2.5.3 Versions amliores ................................................................................................ 16
2.6 Tri fusion ........................................................................................................................ 19
2.6.1 Version interne ........................................................................................................ 19
2.6.2 Version externe ....................................................................................................... 21
2.7 Tri par tas ....................................................................................................................... 22
2.8 Tri par dnombrement.................................................................................................... 26
3. D'autres algorithmes............................................................................................................. 28
3.1 Tri bulles...................................................................................................................... 28
3.2 Tri par slection.............................................................................................................. 28
3.3 Tri par base..................................................................................................................... 28
3.4 Tri par paquets................................................................................................................ 29
3.5 Tri de Shell ..................................................................................................................... 29
4. Quelques exemples d'implmentation et d'utilisation de tris ............................................... 31
4.1 Librairie standard Java ................................................................................................... 31
4.2 Microsoft Word et Excel ................................................................................................ 31
4.3 Oracle ............................................................................................................................. 32
5. Simulations sur ordinateur ................................................................................................... 34
5.1 Dtails sur l'implmentation........................................................................................... 34
5.2 Les types de distributions d'entiers................................................................................. 34
5.3 Rsultats gnraux.......................................................................................................... 36
5.4 Rsultats sur de petits tableaux ...................................................................................... 39
5.5 Sensibilit aux doublons du tri rapide ............................................................................ 39
5.6 Comparaison des deux tris de Java ................................................................................ 40
Conclusion................................................................................................................................ 41
Bibliographie............................................................................................................................ 42
Introduction
Classer les contacts de son carnet d'adresse par ordre alphabtique, trier les rsultats d'une
recherche sur internet par pertinence ou encore archiver ses mails les plus anciens sont des
oprations courantes pour une personne qui utilise un ordinateur. Elles ont toutes en commun
le fait de mettre en oeuvre une opration de tri sur des donnes. Mais ces quelques exemples
anecdotiques, directement perceptibles par l'utilisateur, sont loin de reprsenter l'tendue du
champ d'application du tri en informatique. Le tri des donnes est notamment prsent dans de
nombreux programmes en tant que phase intermdiaire. On retrouve ainsi des algorithmes de
tri dans toutes les applications et jeux 3D pour l'affichage des facettes des objets qui sont
tries selon leur loignement (algorithme Z-sorting). Le tri est galement massivement utilis
par les banques pour la gestion des oprations bancaires.
De nombreux thoriciens de l'informatique considrent le tri comme le problme le plus
fondamental en matire d'algorithmique. Le tri est une des principales oprations excutes
sur les ordinateurs. Des tudes tendent d'ailleurs montrer qu'environ un quart des cycles
machine sont utiliss pour trier1.
De part l'anciennet et l'importance de cette problmatique, un grand nombre d'algorithmes et
de variantes a t invent. A travers cette profusion, comment choisir le bon algorithme ? La
rponse cette question n'est pas universelle et elle dpend de nombreux paramtres. Quelles
sont les contraintes sur les donnes (leur type, leur nombre, leur organisation) ? Est-il
important que l'algorithme n'utilise pas trop d'espace mmoire ? Quels sont les priphriques
de stockage utiliss ? Nous allons aborder ces points et voir en quoi ils influent sur la
problmatique du tri des donnes.
Aprs un rappel sur les notions permettant l'analyse des algorithmes et de leurs performances,
nous nous intresserons aux principaux algorithmes en prsentant une tude dtaille de leur
comportement. Nous voquerons galement de manire plus brve d'autres algorithmes. La
deuxime partie de ce mmoire sera consacre l'exprimentation avec la mise en pratique
des algorithmes tudis et la mesure de leurs performances en situation relle d'une part et
l'tude d'implmentations d'algorithmes de tri dans des outils professionnels d'autre part. Nous
terminerons par une synthse de ces rsultats.
quand n
(f(n)) est l'ensemble de tous les g(n) tels que g(n) f(n) est born infrieurement
La notation exprime une borne suprieure, une borne infrieure et signifie que la borne
suprieure concorde avec la borne infrieure.
Rappel :
: gamma
lgn
: logarithme base 2 de n
lnn
: logarithme nprien de n
logbn : logarithme base b de n
On peut maintenant distinguer diffrents ordres de grandeur de complexit, qui vont dfinir
diffrentes familles d'algorithmes :
1: temps d'excution constant
lgn: temps d'excution logarithmique
n: temps d'excution linaire
nlgn: temps d'excution en nlgn
n: temps d'excution quadratique
n3: temps d'excution cubique
2n: temps d'excution exponentiel
A titre d'illustration voici une comparaison des temps d'excution pour les principales
complexits que nous allons rencontrer (sur la base arbitraire d'une milliseconde pour une
opration lmentaire):
lgn
3 ms
7 ms
10 ms
13 ms
17 ms
20 ms
n
10 ms
100 ms
1s
10 s
1 mn 40 s
16 mn 40 s
nlgn
33 ms
664 ms
10 s
2 mn 13 s
27 mn 41 s
5 h 32 mn
n
100 ms
10 s
16 mn 40 s
1 j 3 h 46 mn
115 j 17 h
31 ans 259 j
On voit donc bien que mme sur un ordinateur trs puissant, la complexit de l'algorithme
reste primordiale dans la dtermination du temps d'excution.
Rappel :
Une relation d'ordre est une relation binaire rflexive, antisymtrique et transitive. Un
ensemble muni d'une relation d'ordre est un ensemble ordonn. est une relation d'ordre et
(E, ) est un ensemble ordonn si :
rflexive : pour tout x dans E, x x
antisymtrique : pour tout x, y dans E, si x y et y x alors x = y
transitive : pour tout x, y, z dans E, si x y et y z alors x z
Si pour tout x, y dans E, on a soit x y, soit y x, alors la relation d'ordre est totale et E est
totalement ordonn; sinon la relation d'ordre est partielle et E est partiellement ordonn.
Pour l'analyse des algorithmes de tri, nous prendrons naturellement comme taille du problme
le nombre n de cls trier.
Ce problme est relativement simple apprhender et il existe de trs nombreux algorithmes
permettant de le rsoudre. Ceci s'explique d'une part parce que ce problme est l'un des plus
anciens de l'informatique, mais galement parce qu'il n'existe pas d'algorithme universel,
performant dans tous les cas. Nous allons voir que les hypothses faites sur la nature des
donnes trier, ainsi que sur les contraintes matrielles (espace mmoire disponible, type de
mmoire secondaire) influent sur les performances des algorithmes prsents.
R. Sedgewick explique que l'on a constamment besoin d'algorithmes de tri plus performants3.
Selon la loi de Moore, la puissance des processeurs et la capacit mmoire des ordinateurs
doublent tous les 18 mois. Mais la taille des problmes suit l'volution de la mmoire. Si un
algorithme permet de trier n cls en un temps de nlgn sur un certain ordinateur, alors quel
temps faut-il pour trier 2n cls sur un ordinateur 2 fois plus puissant ? La rponse est
(2nlg2n)/2 = nlgn + n. C'est dire plus de temps !
L'objectif est ici de prsenter une tude thorique de ces algorithmes et de leur complexit
puis de valider cette tude par l'exprience. L'analyse asymptotique de la complexit donne un
ordre de grandeur. Mais cette tude masque un certain nombre de facteurs constants qu'il peut
tre intressant de connatre pour comparer plus finement des algorithmes dont la complexit
asymptotique est similaire. Nous essaierons de dterminer ces facteurs constants par le
droulement de simulations sur ordinateur.
Une des principales contraintes concerne l'espace mmoire disponible. Est-on capable de trier
l'ensemble des donnes en mmoire centrale? Le volume de donnes est-il plus important que
la taille mmoire ? Dans ce cas il faudra avoir recours aux mmoires secondaires (disque dur
ou bande magntique). Cette contrainte est fortement structurante pour l'tude d'un algorithme
Sedgewick [9]
On reprsente par un arbre de dcision (arbre binaire plein) le droulement d'un tri de n cls,
avec chaque nud interne reprsentant la comparaison entre deux cls du tableau et chaque
feuille reprsentant les permutations devant tre effectues pour avoir le tableau tri4. Ne
connaissant pas l'avance l'ordre des cls au dpart, tout algorithme de tri doit pouvoir
effectuer les n! permutations potentielles. L'arbre de dcision a donc n! feuilles. Si on pose h
la hauteur de l'arbre (la longueur du plus long chemin partant de la racine), alors on sait que le
nombre maximum de feuilles est 2h. Cette hauteur h est le nombre maximum de comparaisons
effectues pour trier le tableau (cas dfavorable). On a donc :
n! 2h
lg(n!) lg(2h)
h = (nlgn)
(car lg(n!) = (nlgn))
Tout algorithme de tri par comparaison exige (nlgn) comparaisons dans le cas le plus
dfavorable.
Cet algorithme de tri est un des plus simples qui existent. Son implmentation est facile
raliser. Il n'est toutefois pas performant ds que le nombre de cls trier devient consquent.
Son tude est donc une bonne introduction l'tude des algorithmes de tri, mme s'il a peu de
chances d'tre utilis en dehors d'un but pdagogique.
L'algorithme du tri par insertion est souvent assimil au joueur qui trie ses cartes. Au dbut, le
joueur a ses cartes places en tas devant lui. Il les prend une par une de sa main droite pour les
placer dans sa main gauche au bon endroit (c'est dire en insrant systmatiquement la
dernire carte saisie sa place).
La procdure suivante prend en paramtre un tableau A [1..n] contenant une suite de n cls
trier. Les cls tant tries sur place, ce mme tableau A contient les cls tries la sortie de la
procdure.
Algorithme issu de [1, page 15]
TRI-INSERTION(A)
1
pour j 2 n faire
2
cl A[j]
3
ij-1
4
tant que i > 0 et A[i] > cl faire
5
A[i + 1] A[i]
6
ii-1
7
fin tant que
8
A[i + 1] cl
9
fin pour
Exemple d'application sur la suite d'entiers 15, 10, 4, 34, 1, 19 :
(a)
(d)
(g)
15
10
34
19
10
15
34
19
10
15
19
34
(b)
(e)
15
10
34
19
10
15
34
19
(c)
(f)
10
15
34
19
10
15
34
19
Sur ce schma on reprsente en noir la case qui est analyse (indice j de la boucle pour, ligne
1). Les cases grises correspondent aux valeurs compares A[j] (condition de la boucle tant
que, ligne 4). Les flches grises reprsentent les cls dplaces (ligne 5) et les flches noires
l'insertion de A[j] sa place (ligne 8).
9
1 = n1
j =2
De la mme manire, on a 2 affectations par passage dans la boucle pour. Le nombre total
d'affectations est :
2 = 2(n1)
n
j =2
La complexit temporelle du tri par insertion dans le cas favorable est (n) .
Cas dfavorable :
A l'oppos du cas favorable, le cas dfavorable arrive lorsque le tableau est tri l'envers.
Dans ce cas, chaque nouvelle cl examine dans la boucle pour principale doit tre ramene
l'indice 1 du tableau et il faut dcaler l'ensemble des cls prcdemment tries. Le nombre
total de comparaisons est alors :
n
n
1
( j1) = n(n21)
1
=
j =2
j =2 i = j 1
+
2
1
=
2
+
( j1) = (n1) 2+ 2
j =2
i = j 1
j =2
j =2
La complexit temporelle du tri par insertion dans le cas dfavorable est (n) .
( )
Cas moyen :
On considre que les cls sont rparties de manire uniforme. Pour un indice donn j de la
boucle pour, la place de la cl situe en A[j] peut tre A[1], A[2] ... A[j]. Ces placements sont
quiprobables. Le nombre de fois que l'on parcourt la boucle tant que est alors :
j
1 1+ 1 2+...+ 1 j = 1 j = j +1
2
j j
j
j
i =1
On a alors le nombre total de comparaisons :
n
n
j +1 1 n
n(n+1)
= j +1 = 1
1+n1 = n n+3 1
2
2
2
2
4
j =2
j =2 j = 2
Et le nombre total d'affectations :
n
n
j +1
j +1 n
( )+2 = +2 = n n+11 3
4
j =2 2
j =2 2
j =2
( )
( )
La complexit temporelle du tri par insertion dans le cas moyen est (n) .
10
Les algorithmes utilisant la stratgie diviser pour rgner sont dcomposs en 3 phases :
diviser : si le nombre de cls est trop important pour tre trait, alors diviser
l'ensemble en n sous-ensembles disjoints.
rgner : appliquer l'algorithme de manire rcursive chacun des sous-ensembles
combiner : fusionner les solutions des sous-ensembles pour obtenir la solution finale
L'tude de la complexit de ce type d'algorithmes rcursifs peut se ramener une rcurrence
au sens mathmatique. Soit un algorithme qui pour traiter un problme de taille n le divise en
a sous-problmes de taille n/b (a 1, b > 1). Si le problme est suffisamment petit (n = 1) il
est rsolu en un temps constant. Le temps ncessaire pour diviser le problme et pour
combiner les solutions des sous-problmes sont fonction de n (respectivement D(n) et C(n)).
On a alors la rcurrence suivante :
T(n) =
(1)
aT(n/b)+ D(n)+C(n)
si n=1
sinon
Il existe plusieurs mthodes pour rsoudre ces rcurrences. Nous utiliserons la mthode
gnrale.
Prsentation de la mthode gnrale
a
a
2) si f(n) = nlogb , alors T(n) = nlogb
a
+
une certaine constante c<1 et pour tout n suffisamment grand, alors T(n) = ( f(n))
De manire gnrale, tout algorithme rcursif consomme de l'espace mmoire pour la pile
d'appel. Cette taille supplmentaire est masque dans l'algorithme. Elle peut devenir
consquente ds lors qu'un grand nombre de paramtres passs par valeur entre en jeu. Il est
possible de supprimer la rcurrence de ces algorithmes en utilisant explicitement une pile.
Nous ne prsenterons pas les versions de ces algorithmes, mais on peut se rfrer [8, page
128] pour les trouver.
11
Le tri rapide fait partie des algorithmes de tri du type "diviser pour rgner". Bien que sa
complexit temporelle dans le pire des cas soit (n) , c'est un des algorithmes les plus utiliss
et galement celui qui prsente certainement le plus grand nombre de variantes.
Le tri rapide choisit un lment particulier de la liste de cls, appel pivot. Il construit ensuite
deux sous-listes gauche et droite contenant respectivement les cls infrieures et suprieures
au pivot. Ainsi pour trier un sous-tableau A[p..r] du tableau initial A[1..n] on retrouve les 3
phases suivantes :
diviser : choisir le pivot d'indice q dans le tableau A[p..r]. Partitionner en 3 ce soustableau :
o A[p..q-1] contient les cls infrieures A[q],
o A[q] le pivot
o A[q+1..r] contient les cls suprieures A[q].
Les deux sous-tableaux gauche et droite peuvent ventuellement tre vides.
rgner : les sous-tableaux A[p..q-1] et A[q+1..r] sont traits en appelant rcursivement
le tri rapide.
combiner : cette phase est instantane. Puisque les sous-tableaux sont tris sur place,
aucun travail n'est ncessaire pour les combiner.
2.5.1 Version standard
Algorithme issu de [1, page 140]
PARTITION(A, p, r)
1
x A[r]
2
ip-1
3
pour j p r - 1 faire
4
si A[j] x alors
5
ii+1
6
PERMUTER(A, i, j)
7
fin si
8
fin pour
9
PERMUTER(A, i + 1, r)
10
retourner i + 1
TRI-RAPIDE(A, p, r)
1
si p < r alors
2
q PARTITION(A, p, r)
3
TRI-RAPIDE(A, p, q - 1)
4
TRI-RAPIDE(A, q + 1, r)
5
fin si
PERMUTER(A, i, j)
1
tmp A[i]
2
A[i] A[j]
3
A[j] tmp
12
(a)
15
10
34
19
PARTITION(A, 1, 6)
(b)
15
10
19
34
TRI-RAPIDE(A,1,4)
(c)
15
10
TRI-RAPIDE(A,6,6)
6
34
(i)
FIN
PARTITION(A, 1, 4)
(d)
TRI-RAPIDE(A,1,0)
FIN
10
15
TRI-RAPIDE(A,2,4)
(e)
10
15
PARTITION(A, 2, 4)
(f)
10
15
TRI-RAPIDE(A,2,3)
(g)
10
TRI-RAPIDE(A,5,4)
FIN
PARTITION(A, 2, 3)
(h)
(j)
10
TRI-RAPIDE(A,2,2)
TRI-RAPIDE(A,4,3)
FIN
FIN
10
15
19
34
13
T(n) = (nlgn)
La complexit temporelle du tri rapide dans le cas favorable est (nlgn) .
Cas dfavorable :
Le partitionnement fournit deux sous-tableaux de tailles 0 et n1 chaque appel rcursif. Ce
partitionnement est compltement dsquilibr, il donne la rcurrence suivante :
T(n) = T(n1)+n1
n
n(n1)
donc T(n) = i1 =
2
i =1
donc T(n) = (n)
La complexit temporelle du tri rapide dans le cas dfavorable est (n) .
Pour simplifier l'tude du cas moyen, nous allons introduire une premire version amliore
du tri rapide.
2.5.2 Version alatoire
Cette version rend le cas dfavorable trs improbable. En effet, au lieu de prendre la dernire
cl du sous-tableau comme pivot, elle prend une cl au hasard. La probabilit d'tre dans le
cas dfavorable (c'est dire de choisir alatoirement une cl qui chaque tape produirait un
partitionnement compltement dsquilibr) est trs faible.
14
Soit
1
+
+
)
Cn
n i=1 C i1 C ni
Or on a :
n
C
i =1
i 1
i =1
ni
C +C +C +...+C
0
n1
= n1+ 2 C i1
n i=1
n
nC n = n(n1)+2C i1
i =1
n 1
nC n = n(n1)+2C i1+2C n1
(2)
i =1
(n1)C n1 = (n1)(n2)+2C i1
i =1
n 1
2C i1 = (n1)C n1(n1)(n2)
(3)
i =1
En posant
nC n = (n+1)C n1+2(n1)
n+1
n+1
n1
2(n1)
n(n+1)
(4)
F
F
2(n1)
n(n+1)
+ 2 2
n1 n+1 n(n+1)
F
= F
n1
15
1
1 2
F 0+ F 1+ F 2+2
i
+
i
(
i
+1)
1
i =3
i =3
n
n
n
1 2 1 1
2
+
+
+
F 0 F1 F 2
i =3 i+1
i=3 i i=3 i+1
F +F + F +4i+1121i
i =3
i =3
n+1
i =4
i =3
F + F + F +41i 21i
0
Or on sait que :
Donc on a :
F
F
F
F
En revenant
n
n
F + F + F +4(H H )2(H H )
= F + F + F +2H 4H +2H + 4
n+1
= F + F + F +2H 13 + 4
3 n+1
= F + F + F 13 +2(lnn+)+(1 )
n
3
=
n+1
(5)
on obtient :
n
= C 0 + C1 + C 2 +2lnn+2 13+(1)
n+1
n
3
1 2 3
= 0 et C 2 = 1
Or on a
= 0,
Or on a lnn =
C
C
n
n
= 2(n+1)lnn+(n+1)(2 4)+(1)
~ 2nlnn2,84558n
lgn
~ 0,69315lgn
lge
~ 1,38629nlgn2,84558n
~ 0,69315nlgn0,42279n
La complexit temporelle du tri rapide alatoire dans le cas moyen est (nlgn) .
2.5.3 Versions amliores
Il existe de nombreuses versions "amliores" du tri rapide. Elles diffrent en fonction du
point faible de l'algorithme standard qu'elles souhaitent corriger.
Bien que les performances asymptotiques du tri rapide soient largement meilleures que celles
du tri par insertion, il n'en est pas de mme sur les petits ensembles5. L'ordre de grandeur
asymptotique ne fait pas apparatre un certain nombre de constantes qui sont ngligeables
devant n lorsque n est grand mais qui deviennent importantes pour n petit. Or un algorithme
5
16
+
+
1
Cn
C i1 n
n i =
4
M +1
i =1
{ ( )
Par une dmarche similaire celle employe prcdemment, on obtient pour n > M:
F n = F M +4(H n+1H M +1)2(H nH M )
[...]
M(M +3)
3
C n ~ 2nlnn+ f(M)n avec f(M) = M4 +1 2lnM
Voici le graphe de la fonction f :
Le minimum est atteint pour M ~ 6,355 (seule racine de la drive). On prendra M = 7 pour
implmenter cette solution optimise. Une autre option est de ne pas trier les tableaux dont la
taille est infrieure M. Lorsque le tri rapide se termine, il ne reste plus qu' excuter un tri
par insertion sur l'ensemble du tableau. Globalement il faut voir que le tri rapide rapproche
beaucoup plus vite que le tri par insertion les cls de leur emplacement final.
On a vu que le problme principal du tri rapide est de russir partitionner correctement (de
manire quilibre) l'ensemble trier. La version alatoire ne permet pas d'optimiser ce
problme, elle vite juste le cas de la dgnrescence quadratique sur les tableaux dj tris.
Un moyen d'optimiser le tri rapide est donc de faire en sorte de mieux choisir le pivot. Au lieu
de choisir une cl (choisie au hasard ou non), on va en choisir plusieurs que l'on va analyser
pour savoir laquelle est la meilleure. Une possibilit est de choisir 3 cls et de prendre comme
pivot celle qui a la valeur mdiane des 3. On appelle alors cette variante le tri rapide mdianede-trois. On peut ventuellement choisir parmi plus de 3 lments. Une autre variante, dite
pseudo-mdiane-de-neuf consiste choisir comme pivot la cl mdiane de 3 valeurs mdiane
de 3 ensembles de 3 cls (mdiane de 3 mdianes). Comme pour la version incluant le tri par
17
~ 1,088nlgn - 1,1512n
18
TRI-FUSION(A, p, r)
1
si p < r alors
2
q ( p + r) / 2
3
TRI-FUSION(A, p, q)
4
TRI-FUSION(A, q + 1, r)
5
FUSION(A, p, q, r)
6
fin si
19
(a)
15
10
34
19
TRI-FUSION(A,1,6)
(b)
15
10
34
19
TRI-FUSION(A,1,3)
(c)
15
10
34
19
TRI-FUSION(A,3,3)
TRI-FUSION(A,4,5)
TRI-FUSION(A,1,2)
(d)
TRI-FUSION(A,4,6)
TRI-FUSION(A,3,3)
15
10
34
19
FUSION(A,1,1,2)
(e)
FUSION(A,4,4,5)
10
15
34
FUSION(A,1,2,3)
(f)
FUSION(A,3,4,5)
10
15
19
34
FUSION(A,1,3,6)
(g)
10
15
19
34
20
Contrairement au tri rapide, le tri fusion commence par partitionner le problme en deux sousproblmes de tailles gales avant d'appliquer une procdure en (n) . On est donc toujours
dans le cas du partitionnement favorable du tri rapide. Ceci nous assure que le nombre
d'tapes de partitionnement sera minimum.
Toutefois, cet algorithme ne trie pas sur place. Il ncessite un espace mmoire supplmentaire
en (n) . Pour s'en convaincre, il suffit d'envisager la dernire fusion qui doit tre faite. Elle
correspond la partition du tableau initial. On a donc 2 sous-tableaux temporaires de taille
n/2.
Comme pour le tri rapide, il est possible d'optimiser le tri fusion en lui substituant un tri par
insertion pour les petits tableaux.
2.6.2 Version externe
Pour de trs nombreuses applications, la quantit de donnes trier est bien suprieure la
capacit mmoire de l'ordinateur. Il faut dans ce cas un algorithme particulier qui va s'appuyer
sur les mmoires secondaires (disques durs ou bandes magntiques) pour trier. La premire
contrainte est que les temps d'accs de ces mmoires secondaires est tellement grand, qu'il
n'est pas comparable avec les temps d'accs et de traitement en mmoire centrale. La
complexit de ces algorithmes est donc tudie en fonction du nombre d'entres/sorties plutt
que du nombre d'changes ou de comparaisons. La seconde contrainte est li au type et au
nombre de mmoires secondaires. En effet, contrairement un disque dur, une bande
magntique ne peut tre accder que squentiellement.
Nous nous intresserons ici une version du tri par fusion utilise avec des disques durs au
sein des bases de donnes. Pour une version sur bandes magntiques, se reporter [8, chapitre
13] ou [2, chapitre 5].
On suppose qu'on a n cls trier et qu'on dispose d'un espace en mmoire centrale permettant
de stocker uniquement M cls.
La premire tape est de crer des partitions de l'ensemble des cls qui puissent tenir en
mmoire centrale. On lit donc les cls par blocs de taille M. Chaque bloc est tri en mmoire
centrale l'aide d'un des algorithmes vu prcdemment. Il est ensuite rcrit sur le disque
pour librer l'espace mmoire pour trier les blocs suivants. A la fin de cette premire tape, on
a donc n/ M partitions tries de taille M. Le cot de cette phase est de n lectures et n
critures.
La seconde tape, comme pour le tri fusion classique, consiste interclasser les partitions
tries. Pour cela, on lit en parallle les cls de M-1 partitions et on stocke la cl minimum
dans le dernier espace mmoire afin de l'crire sur le disque dans la nouvelle partition
rsultant de cette fusion. A la fin de cette tape, on a donc n/ M(M 1) partitions de taille
M(M-1) chacune (sauf ventuellement la dernire). On recommence cette seconde tape
21
Les pistes d'optimisation pour ce tri sont principalement lies l'utilisation en parallle de
plusieurs disques / bandes. On n'conomise pas forcment en nombre d'entres / sorties mais
en temps.
2.7 Tri par tas
Nom anglais : heap sort - Proprits : tri interne, non stable, sur place
Le tri par tas est un tri qui se base sur une structure de donnes particulire : le tas. Il s'agit
d'une reprsentation d'un arbre binaire sous forme de tableau. L'arbre est presque complet : il
est compltement rempli tous les niveaux, sauf potentiellement le dernier. Le parcours de
l'arbre (trouver le pre ou les fils droit et gauche d'un nud) se fait par un calcul d'indice sur
le tableau. Pour un nud d'indice i, on a le pre l'indice i /2 , le fils gauche l'indice 2i et
le fils droit l'indice 2i + 1. On distingue la longueur du tableau, qui est le nombre d'lments
prsents dans le tableau, de la taille du tableau, qui est le nombre d'lments du tas. Il se peut
que les derniers lments du tableau ne fassent donc pas partie du tas. Cette petite distinction
permet d'effectuer le tri sur place en conservant le tas et les cls dj tries dans le mme
tableau et en les distinguant l'aide de ces deux indices. Dans l'exemple suivant, la longueur
du tableau est 8, alors que sa taille est 6. Ainsi les deux dernires cases ne font pas partie du
tas :
1
15
2
15
10
34
19
24
10
g
g
5
34
6
19
Il existe deux types de tas : les tas max et les tas min. Ils correspondent la manire dont les
nuds sont organiss. Dans un tas max, le pre a toujours une valeur suprieure ou gale
celles de ses 2 fils. L'lment racine est donc l'lment maximum du tas. C'est le contraire
dans un tas min. Le tri par tas se base donc sur un tas max pour trier le tableau sous-jacent.
22
GAUCHE(i)
1
retourner 2i
ENTASSER-MAX(A, i)
1
l GAUCHE(i)
2
r DROITE(i)
3
si l taille[A] et A[l] > A[i] alors
4
max l
5
sinon
6
max i
7
fin si
8
si r taille[A] et A[r] > A[max] alors
9
max r
10
fin si
11
si max i alors
12
PERMUTER(A, i, max)
13
ENTASSER-MAx(A, max)
14
fin si
DROITE(i)
1
retourner 2i + 1
CONSTRUIRE-TAS-MAX(A)
1
taille[A] longueur[A]
2
pour i longueur[A]/2 1 faire
3
ENTASSER-MAX(A, i)
4
fin pour
TRI-PAR-TAS(A)
1
CONSTRUIRE-TAS-MAX(A)
2
pour i longueur[A] 2 faire
3
PERMUTER(A, 1, i)
4
taille[A] taille[A] - 1
5
ENTASSER-MAX(A,1)
6
fin pour
23
(b)
CONSTRUIRE-TAS-MAX
(c1)
TRI-PAR-TAS
(c2)
ENTASSER-MAX
15
34
19
10
15
19
15
19
15
34
19
10
10
34
10
34
(d1)
(d2)
(e1)
15
10
ENTASSER-MAX
(e2)
ENTASSER-MAX
15
10
10
10
19
34
19
34
15
19
34
15
19
34
(f2)
(g)
(f1)
ENTASSER-MAX
10
10
10
15
19
34
15
19
34
15
19
34
Sur ce schma on reprsente en gris les lments dj tris. Pour chaque indice i de la boucle
pour de la procdure TRI-PAR-TAS on a reprsent les deux tapes du placement du
maximum sa position finale puis de l'appel ENTASSER-MAX pour rorganiser le tas.
Etude de la complexit :
ENTASSER-MAX :
On tudiera, sans nuire la gnralit, uniquement les tas complets, c'est dire les tas dont la
taille vrifie :
taille[A] =
(k 0)
i =0
La procdure ENTASSER-MAX appele sur un tas de taille n utilise un temps constant pour
comparer le pre et ses deux fils. Il y a ensuite un ventuel appel rcursif sur un des sousarbres pour le cas o un change a eu lieu. La taille de ce sous-arbre est n/2. On a alors la
rcurrence suivante :
T(n) T(n/2) + (1)
En utilisant le cas 2) du thorme gnral avec a = 1 et b = 2 on obtient alors :
24
T(n) = (lgn)
On peut galement borner le temps d'excution de cette procdure sur un nud de hauteur h
par O(h).
La complexit de la procdure ENTASSER-MAX est en (lgn) .
CONSTRUIRE-TAS-MAX :
On peut facilement voir que la procdure CONSTRUIRE-TAS-MAX appelle n/2 fois
ENTASSER-MAX. Donc on peut borner sa complexit par O(nlgn).
Il est possible d'obtenir un majorant plus prcis. On constate que la hauteur d'un tas est lgn et
que le nombre d'lments prsents la hauteur h est n/2h+1. La complexit de la procdure est
alors :
lgn
lgn
n O(h) = n h
(1)
h +1
h =0 h
h =0
2
2
Or on sait que :
k
x
=
k
(1x)
k =0
Donc :
h
2
h=0
1/ 2
(11/2)
=2
lgn
n hh n hh
h =0
2 h=0 2
lgn
n hh = O(2n)
h =0
2
25
On a vu jusqu' prsent des algorithmes de tri par comparaison. On sait que pour les meilleurs
d'entre eux la complexit est en (nlgn) . En faisant quelques hypothses sur les cls trier,
on peut utiliser des algorithmes ne faisant pas appel la comparaison, et ainsi obtenir des
complexits temporelles meilleures.
Ainsi le tri par dnombrement prend comme hypothse que l'on trie des entiers et que l'on
connat l'intervalle 0..k dans lequel sont choisies les n cls trier. Le tri par dnombrement
dtermine pour chaque cl le nombre de cls qui lui sont infrieures. Avec cette information,
la cl peut tre place au bon endroit dans le tableau tri par un simple calcul d'adresse.
Comment faire pour dterminer le nombre de cls infrieures une cl donne sans utiliser de
comparaison? C'est l le rle des hypothses rductrices faites sur les cls. Comme on ne trie
que des entiers et que les tableaux sont indics par des entiers, la valeur d'une cl sert
galement d'indice de tableau.
Algorithme issu de [1, page 124]
TRI-DENOMBREMENT(A, B, k)
1
pour i 0 k faire
2
C[i] 0
3
fin pour
4
pour j 1 n faire
5
C[A[j]] C[A[j]] + 1
6
fin pour
7
pour i 1 k faire
8
C[i] C[i] + C[i - 1]
9
fin pour
10
pour j n 1 faire
11
B[C[A[j]]] A[j]
12
C[A[j]] C[A[j]] - 1
13
fin pour
Le tri a besoin de deux tableaux supplmentaires pour trier. Le tableau A[1..n] est le tableau
initial contenant les cls trier. Le tableau B[1..n] contient le rsultat final. Le tableau C[0..k]
sert dnombrer le nombre de cls infrieures une cl donne.
La premire phase (boucle des lignes 4 6) place dans chaque case C[i] le nombre de cls
gales i dans le tableau A. Ensuite, la seconde phase (boucle des lignes 7 9) fait la somme
des valeurs obtenues afin d'avoir dans chaque case C[i] le nombre de cls infrieures ou
gales i. Il ne reste alors qu' lire dans C l'indice final de chacun des lments du tableau A
pour les placer dans le tableau B (boucle des lignes 10 13).
26
tableau initial
initialisation de C
phase 2
15
10
34
19
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0
tableau tri
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0
phase 1
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
0 1 0 0 2 0 0 0 0 0 3 0 0 0 0 4 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
1
10
15
19
34
Etude de la complexit :
Cet algorithme est insensible la distribution des donnes ainsi qu' la prsence ou non de
cls en plusieurs exemplaires. On n'a donc pas de cas favorable ou dfavorable.
La premire boucle (initialisation de C) est en (k) .
La seconde boucle (phase 1) est en (n) .
La troisime boucle (phase 2) est en (k) .
La dernire boucle (remplissage de B) est en (n) .
Au total, la complexit de ce tri est donc (2n+2k) .
L'espace mmoire supplmentaire ncessaire pour effectuer le tri est en (n+k) .
27
3. D'autres algorithmes
3.1 Tri bulles
Nom anglais : bubble sort - Proprits : tri interne, non stable, sur place
Complexit dans tous les cas en (n)
Le principe de cet algorithme est d'changer les cls contigus qui ne sont pas correctement
tries. Son nom vient du fait que les cls se dplacent comme des bulles dans une flte de
champagne. Elles remontent d'ailleurs si lentement que cela explique la complexit
quadratique.
Algorithme issu de [1, page 35]
TRI-BULLES(A)
1
pour i 1 n faire
2
pour j n i + 1 faire
3
si A[j] < A[j - 1] alors
4
PERMUTER(A, j, j - 1)
5
fin si
6
fin pour
7
fin pour
3.2 Tri par slection
Nom anglais : selection sort - Proprits : tri interne, stable, sur place
Complexit dans tous les cas en (n)
Ce tri n'utilise pas de comparaison entre les cls. Il se base sur la reprsentation interne de la
cl. Ainsi, pour trier des entiers de c chiffres, l'algorithme utilise un tri stable pour trier les
cls selon chacun de ces chiffres en commenant par le chiffre des units. Pour le tri d'entiers,
on va choisir le tri par dnombrements comme sous-tri.
28
Ce tri n'utilise pas de comparaison entre les cls. Comme le tri par dnombrement il se sert de
la valeur des cls pour calculer un indice de tableau. L'hypothse faite sur les donnes en
entre du tri est qu'elles sont rparties de manire uniforme sur l'intervalle [0, 1[ (en pratique,
on peut toujours normaliser les donnes pour les ramener dans cet intervalle. L'hypothse
importante est donc la distribution uniforme). L'ide est de partager cet intervalle [0, 1[ en n
paquets de mme taille, puis de placer les donnes dans ces paquets. Dans un deuxime
temps, chacun des paquets est tri l'aide d'un tri auxiliaire puis les donnes sont rassembles en parcourant les paquets dans l'ordre. On utilise des listes chanes pour stocker
les cls dans les paquets.
Algorithme issu de [1, page 168]
TRI-PAQUETS(A)
1
pour i 1 n faire
2
insrer A[i] dans la liste B[ nA[i] ]
3
fin pour
4
pour i 0 n - 1 faire
5
trier la liste B[i] via un tri par insertion
6
fin pour
7
concatner les listes B[0], B[1], ..., B[n - 1] dans l'ordre
La complexit de ce tri pour une distribution uniforme est linaire.
3.5 Tri de Shell
Nom anglais : Shell sort - Proprits : tri interne, stable, sur place
Le tri de Shell est une variante du tri par insertion. On sait que le tri par insertion fonctionne
bien sur des tableaux presque tris. Le tri de Shell utilise un squence d'entiers, appele
squence-h. Il effectue pour chaque entier de cette squence un tri par insertion sur les
lments d'indice i, i+h, i+2h, ... Partant d'une valeur de h trs grande pour arriver 1,
l'algorithme organise petit petit le tableau pour le rendre plus facile trier lorsque h = 1 (tri
par insertion classique).
29
Pratt, 1971
Papernov-Stasevich, 1965
Pratt, 1971
Sedgewick, 1982
Complexit
2
n logn
( )
(n )
Squence-h
1 2 3 4 6 9 8 12 18 27 16 24 36 54 81 ...
3/ 2
4/3
30
Ce premier algorithme est utilis pour trier les tableaux d'instances quelconques. Il suffit que
les lments implmentent la mthode compareTo de l'interface Comparable et qu'ils soient
comparables entre eux. Dans ce cas, l'algorithme est un tri fusion amlior. La documentation
explique que ce tri est stable et que les performances en nlgn sont garanties. En regardant le
code source on s'aperoit qu'un tri par insertion est utilis pour les tableaux de taille infrieure
7. De plus si le tableau est dj tri, l'algorithme ne le re-trie pas.
public static void sort(long[] a)
Ce deuxime algorithme est utilis pour trier les tableaux de types primitifs. On regardera la
version permettant de trier les entiers de type long. Les implmentations pour les autres types
primitifs sont trs similaires. Il s'agit d'une version amliore du tri rapide, adapte d'un
algorithme de J. Bentley et D. McIlroy de 1993. Si la taille du tableau est infrieure 7, un tri
par insertion est utilis. Entre 8 et 40 un tri rapide mdiane-de-trois est utilis, et au del il
s'agit d'un tri rapide pseudo-mdiane-de-neuf. Il s'agit de la version vue dans [10] en
remplaant le tri rapide standard par le tri par insertion pour les plus petits ensembles.
4.2 Microsoft Word et Excel
Howard Kaikow propose sur son site web6 un utilitaire permettant de comparer diffrentes
implmentations d'algorithmes de tri sur des jeux de donnes alatoires. Il intgre notamment
des appels aux tris de Microsoft Word et Excel. Les donnes sont places dans un document
Word ou bien dans une feuille de calcul Excel puis sont tries par les diffrents algorithmes.
On obtient le temps en millisecondes ncessaire aux tris. Les rsultats se passent de
commentaires.
Donnes
Contenant
Type
Tris
Nombre
Quick Sort
Excel Sort
Word Sort
Worksheet
Entiers
1000
380
1188
Worksheet
Entiers
10000
504
1539
Worksheet
Entiers
25000
530
1634
Worksheet
Entiers
50000
566
1802
Worksheet
Chanes
1000
391
1198
Worksheet
Chanes
10000
620
1643
Worksheet
Chanes
25000
794
1945
Worksheet
Chanes
50000
975
2279
Document
Entiers
1000
22
83
Document
Entiers
10000
89
966
Document
Entiers
15000
139
1617
Document
Chanes
1000
16
84
Document
Chanes
10000
1225
4657
Document
Chanes
15000
3204
11672
http://www.mv.com/ipusers/standards/
31
On va utiliser une table role contenant 300 000 enregistrements, et plus particulirement la
colonne idacteur qui contient 20 000 cls diffrentes rparties alatoirement. La table
complte occupe 2205 blocs sur le disque.
On fixe db_block_buffer 65535 blocs. Ainsi la premire fois que la table est parcourue elle
est entirement stocke en mmoire cache.
Nous allons faire varier sort_area_size et voir comment volue le temps et le nombre de
lectures de blocs ncessaire pour trier l'ensemble des cls idacteur de la table role. La requte
utilise est :
select /*+ full(role) */ idacteur from role order by idacteur asc;
Cette requte est systmatiquement excute deux fois pour avoir les rsultats avec et sans le
rapatriement des blocs de la table. On pourra ainsi isoler les lectures lies au tri. On obtient les
rsultats suivant (le temps est en ms):
Excution 1
sort_area_size
lectures
Excution 2
temps
lectures
temps
11529
29
9322
25
11537
30
9327
26
6904
15
4684
12
16
6039
11
3821
32
4121
1904
64
3582
1364
128
3117
900
0,9
1024
3109
890
2048
2215
0,9
Ceci est vrifi sur le graphe suivant (sort_area_size compris entre 4 et 1024), pour lequel on
a galement fait apparatre la droite issue de la rgression linaire sur ce jeu de test :
32
10000
y = 0,8973x - 2044,6
8000
Lectures
6000
4000
2000
0
2000
4000
6000
8000
10000
12000
N LOGsort_area_size(N)
33
Il ne reste plus qu' dfinir une classe hritant de MonitoredData reprsentant les donnes que
l'on souhaite trier. On remarquera que tous les dplacements de donnes sont en fait des
dplacements de rfrences (pointeurs) et ne sont donc pas coteux en temps. La plupart des
tests qui suivent ont t drouls sur des entiers l'aide de la classe SimpleInteger.
On a mesur le temps ncessaire pour effectuer un change et une comparaison dans un
tableau :
temps pour 100 000 000 changes de long
: 547 ms
temps pour 100 000 000 comparaisons de long
: 453 ms
temps pour 100 000 000 changes de SimpleInteger
: 844 ms
temps pour 100 000 000 comparaisons de SimpleInteger : 1984 ms
Dans le cas des instances de SimpleInteger, le temps d'une comparaison est suprieur au
temps d'un change d'environ 235 % alors que dans le cas du type primitif long il est infrieur
de 20 % Les carts entre les deux types de donnes s'expliquent par les couches objets et les
appels de mthodes.
5.2 Les types de distributions d'entiers
Afin de modliser les diffrentes organisations de donnes que l'on est susceptible de
rencontrer, nous avons dfini 9 distributions possibles. Pour chacune d'entre elles on peut
donc gnrer un jeu de test en fournissant 3 paramtres :
le nombre d'entiers dans le jeu
34
Les illustrations suivantes ont t gnres pour 100 entiers compris entre 1 et 100.
Distribution croissante et dcroissante:
Ce type de distributions fournit des donnes tries allant du minimum au maximum (ou
l'inverse). S'il y a plus d'entiers gnrer que ne le permet l'cart entre le minimum et le
maximum, des doublons seront ajouts.
100
100
90
90
80
80
70
70
60
60
50
50
40
40
30
30
20
20
10
10
Distribution sinusode :
Les donnes sont gnres sous forme de sinusode. Il y a donc quelques doublons.
100
90
80
70
60
50
40
30
20
10
0
100
90
90
80
80
70
70
60
60
50
50
40
40
30
30
20
20
10
10
35
distribution
n
1 000
2 500
5 000
10 000
croissante
ms
comp
1,55
9 976
3,12
28 404
6,24
61 808
14,06
133 616
Tri fusion
dcroissante
presque croissante presque dcroissante
sinusoide
presque sinusoide
ms
comp
ms
comp
ms
comp
ms
comp
ms
comp
1,58
9 976
1,56
9 976
1,56
9 976
1,57
9 976
1,56
9 976
3,13
28 404
3,12
28 404
3,10
28 404
3,13
28 404
3,12
28 404
6,27
61 808
6,25
61 808
6,23
61 808
7,35
61 808
6,23
61 808
12,98
133 616 14,05
133 616 13,26
133 616 12,50
133 616 14,06
133 616
presque sinusoide
ms
comp
0,15
8 006
1,53
23 400
4,67
51 726
10,92
113 673
alatoire
ms
comp
1,57
9 976
3,10
28 404
6,39
61 808
14,04
133 616
alatoire
ms
comp
0,00
8 997
2,98
25 870
4,86
56 786
10,49
123 490
mlange
ms
comp
1,57
9 976
3,12
28 404
7,81
61 808
14,06
133 616
mlange
ms
comp
0,00
9 010
2,34
25 881
6,26
56 763
10,63
123 514
gauss
ms
comp
1,56
9 976
3,12
28 404
7,67
61 808
12,65
133 616
gauss
ms
comp
0,80
9 001
3,15
25 899
6,25
56 767
11,11
123 555
37
distribution
n
1 000
2 500
5 000
10 000
croissante
ms
comp
37,34
499 500
204,67
3 123 750
845,00
12 497 500
distribution
n
1 000
2 500
5 000
10 000
distribution
n
1 000
2 500
5 000
10 000
croissante
ms
comp
37,51
499 485
212,81
3 123 735
870,91
12 497 485
croissante
ms
comp
1,58
17 583
4,84
51 032
10,93
112 126
17,97
244 460
alatoire
ms
comp
1,55
10 948
3,13
32 021
6,40
71 181
13,27
156 106
dcroissante
presque croissante
ms
comp
ms
comp
1,53
15 965
1,25
16 926
3,59
46 694
4,86
49 228
10,14
103 227 11,08
108 505
17,36
226 682 18,12
236 974
alatoire
ms
comp
0,16
10 790
3,13
31 535
4,86
69 873
11,73
155 587
sinusoide
presque sinusoide
ms
comp
ms
comp
1,25
16 616
1,57
16 737
4,69
48 190
4,54
48 627
9,69
106 312 10,66
107 249
17,52
232 324
17,8
234 532
mlange
ms
comp
0,00
11 110
3,12
32 181
6,27
70 910
12,50
152 510
mlange
ms
comp
0,63
11 070
3,11
31 756
6,90
70 690
12,96
157 629
alatoire
ms
comp
0,15
10 823
3,14
31 656
5,00
69 957
11,88
155 206
alatoire
ms
comp
1,85 16 879
5 48 809
10,93 107 708
17,34 235 374
gauss
ms
comp
0,93
11 188
3,13
31 693
6,26
72 158
12,34
159 884
gauss
ms
comp
1,50
10 934
3,12
31 971
6,56
71 038
12,35
157 261
mlange
ms
comp
0,00
11 179
3,13
32 319
6,25
71 259
11,89
153 215
mlange
ms
comp
1,57
16 832
4,69
48 846
10,63
107 684
17,97
235 397
gauss
ms
comp
0,78
11 264
2,97
31 757
6,10
71 879
11,72
157 429
gauss
ms
comp
1,56
16 862
4,68
48 842
10,79
107 733
17,97
235 326
38
insertion
rapide
200,0
11,0
21,9
15,7
36,0
34,4
51,6
140,0
39,1
70,4
120,0
62,3
99,8
100,0
79,9
109,5
80,0
92,1
121,9
118,9
148,3
10
153,0
176,7
20
481,3
482,8
180,0
160,0
60,0
40,0
20,0
50
0,0
2
2 643,6 1 603,1
i nser ti on
10
r api de
On voit que pour de petits tableaux le tri par insertion est plus rapide que le tri rapide
standard. Ceci est vrai jusqu' n = 20 environ.
5.5 Sensibilit aux doublons du tri rapide
Puisque toutes les tudes sur le tri rapide ont t faites en prenant comme hypothse que les
cls taient uniques dans la distribution, nous avons fait tourner quelques jeux sur lesquels
nous faisant varier le nombre de fois qu'une cls est prsente. On a pris des distribution
alatoire de 10 000 cls pour lesquelles on a fait varier le maximum. Le tri rapide standard a
t utilis. Les performances se dgradent ds que des doublons apparaissent.
max
n / max
ms
comp
max
n / max
ms
comp
50
200
54,186
1070127,8
10000
7,173
156970,5
100
100
29,889
587440,1
50000
0,2
7,126
156636,4
500
20
10,079
216227,2
100000
0,1
7,313
158061,7
1000
10
8,498
174022,2
500000
0,02
7,033
155158,9
2500
7,842
162161,5
1000000
0,01
7,219
155492,3
5000
7,237
160409,7
50
100
60
50
40
30
20
10
0
0
150
200
250
n / ma x
39
long
SimpleInteger
1400
10 000
39
115,4
50 000
121,9
487,6
100 000
256,4
1 196,9
1200
1000
800
600
400
200
0
0
20000
40000
60000
80000
100000
120000
l ong
Si mpl eInteger
Les diffrences s'expliquent par l'cart entre le temps de comparaison de deux SimpleInteger
et le temps de comparaison de deux long (voir 5.1).
40
Conclusion
A travers les diffrentes analyses thoriques et les tests drouls sur ordinateur, on peut se
rendre compte de la diversit des algorithmes de tri. Cette tude a permis de mettre en avant
un certain nombre de paramtres qu'il faut bien prendre en compte au moment de choisir un
algorithme de tri. Un point important est de bien dfinir le modle des donnes trier (type,
distribution, bornes), ainsi que l'utilisation exacte qui sera faite de l'algorithme (librairie
gnrique, utilisation pour un problme trs spcifique).
Les deux principaux tris par comparaisons sont le tri fusion et le tri rapide. Le premier est sr
de partitionner de manire quilibr chaque tape, mais il dplace les donnes moins
rapidement vers leur position finale, l'inverse du second. Les optimisations sur ces deux tris
ont pour but de les rendre optimaux au regard de la limite thorique sur ce type de tri.
Globalement les deux algorithmes de tri implments dans la librairie Java sont performants
tant donn qu'ils sont gnriques et n'ont pas d'hypothses particulires sur les donnes. Pour
une utilisation plus pousse, il faut penser regarder les versions optimises dans les rapports
de recherche. Il ne faut pas hsiter non plus passer de la version rcursive la version
itrative des algorithmes "diviser pour rgner".
Lorsque c'est possible, il ne faut pas oublier les tris linaires.
Un certain nombre de pistes n'ont pas t abordes mais pourraient faire l'objet d'une tude
plus pousse :
algorithmes de tri sur des listes chanes plutt que sur des tableaux
les algorithmes spcifiques de tri de chanes de caractres
les tris externes sur bandes magntiques
lien entre le tri et la recherche de cls
les algorithmes de tri sur machines multi-processeurs
Si on en juge par la frquence des parutions des laboratoires informatiques sur la thmatique
du tri, il semble que, malgr son anciennet, ce sujet soit encore amen voir des
optimisations, et peut tre de nouveaux algorithmes.
41
Bibliographie
[1] T. CORMEN, C. LEISERSON, R. RIVEST et C. STEIN, Introduction l'algorithmique
2me dition, Paris, ditions Dunod, 2002, chapitres 1 8
[2] D. BEAUQUIER, J. BERSTEL et P. CHRETIENNE, Elments d'algorithmique, Paris,
ditions Masson, 1992, chapitres 1 et 5
[3] R. FAURE, B. LEMAIRE, C. PICOULEAU, Prcis de recherche oprationnelle 5me
dition, Paris, ditions Dunod, 2000, chapitre 2
[4] P. RIGAUX et M. SCHOLL, Cours de Bases de Donnes Aspects Systmes(draft),
septembre 2001
[5]
S.
SEIDEN,
Theoretical
Computer
http://www.tug.org/texshowcase/cheat.pdf
Science
Cheat
Sheet,
1994,
Quickening
quick-sort,
2003,
42