Académique Documents
Professionnel Documents
Culture Documents
1 6 1 3
Benot Charroux - Tris - Septembre 98 - 21
Algorithme du tri rapide
1MLVWMV triRapide( t: tab en entre sortie, g: VMV, d: VMV )
1MMMV
1VM
V p: VMV
d > g Mb
p <- partitionnement( t, g, d ) /* p = pivot */
triRapide( t, g, p-1 ) /* trier partie gauche */
triRapide( t, p+1, d ) /* trier partie droite */
1M b
1M
Benot Charroux - Tris - Septembre 98 - 22
Algorithme du tri rapide
)RQFWLRQpartitionnement( t: tab, g: HQWLHU, d: HQWLHU ): HQWLHU
$OJRULWKPH
'pEXW
9DULDEOH i, j, p, tmp: HQWLHU
p <- t|d] /* pivot = lment de droite */
i <- g-1 /* i = curseur partant de la gauche */
j <- d /* j = curseur partant de la droite */
5pSpWHU
5pSpWHU /* recherche partir de la gauche ...*/
i <- i+1
7DQWTXHt[ i ] < p /* du premier lment > pivot */
5pSpWHU /* recherche partir de la droite ...*/
j <- j-1
7DQWTXHj>i HWt[ j ] > p /* du premier lment < pivot */
6Li >= j DORUV /* si les curseurs se rejoignent */
EUHDN /* la partition est faite */
)LQVL
tmp <- t[i] t[i] <- t[j] t[j] <- tmp /* change des lments aux curseurs */
6DQVFRQGLWLRQ
tmp <- t[i] t[i] <- t[d] t[d] <- tmp /* dplacement du pivot sa place */
UHWRXUi
)LQ
20 6 1 11 2 7
2 6 1 11 20 7
Benot Charroux - Tris - Septembre 98 - 23
Performance du tri rapide
1 2 6 7 11 20
1 2 6 7 11
1 2 6 7
1 2 6
1 2
1
Tri le plus employ :
relativement simple ;
de lordre de NlogN oprations en moyenne pour trier N lments ;
de lordre de N
2
oprations dans le pire des cas : tableaux simples
(dj tris par exemple) ;
mthodes pour amliorer les performances (partitionnement par la
mdiane).
Benot Charroux - Tris - Septembre 98 - 24
Tri par fusion (merge sort)
20 6 1 3 10 8 15 12
20 6 1 3 10 8 15 12
20 6 1 3 10 8 15 12
6 20
1 3
1 3 6 20
8 10
12 15
8 10 12 15
1 3 6 8 10 12 15 20
20 6 1 3 10 8 15 12
Fusion :
Division :
Benot Charroux - Tris - Septembre 98 - 25
Diviser
1MLVWMV triFusion( t: tab en entre sortie, g: VMV, d: VMV )
1MMMV
1VM
V m: VMV
d > g Mb
m <- (g+d) / 2
triFusion( t, g, m ) /* trier partie gauche */
triFusion( t, m+1, d ) /* trier partie droite */
/* fusionner */
1M b
1M
Benot Charroux - Tris - Septembre 98 - 26
Fusionner laide dun tableau intermdiaire 1/2
...
3RXU i GH m j g UpSpWHU
s[ i ] <- t[ i ]
)LQSRXU
3RXU j GH m+1 j d UpSpWHU
s[ d+m+1-j ] <- t[ j ]
)LQSRXU
...
1 3 6 20 8 10 12 15 tableau t :
1 3 6 20 15 12 10 8 tableau intermdiaire s :
g m d
Partie miroir de t
Remplir le tableau intermdiaire s.
Benot Charroux - Tris - Septembre 98 - 27
Fusionner laide dun tableau intermdiaire
tableau t :
j
i, k
d
g
6
Comparer les lments de s deux deux pour les fusionner dans t.
Tri par fusion :
nombre de comparaison de lordre NlogN pour trier N lments ;
place mmoire supplmentaire proportionnelle N ;
tri idal pour pour les listes chanes (accs squentiel) en changeant
la partie fusion de lalgorithme.
Benot Charroux - Tris - Septembre 98 - 28
Performance du tri par fusion
Benot Charroux - Tris - Septembre 98 - 29
Tri par tas (heap sort)
20 6 1 3 10 8 15
20
10 15
3 6 1 8
15
10 8
3 6 1
Transformer en tas
Trier :
Transformer en tas
tel que pre > fils pre
supprimer le maximum et rtablir la condition pre > fils pre ;
10 15
3 6 1 8
20
20
itrer le processus tant que le tableau nest pas tri.
Benot Charroux - Tris - Septembre 98 - 30
Transformer en tas
20 6 1 3 10 8 15
20
10 15
3 6 1 8
20 10 15 3 6 1 8
0 1 2 3 4 5 6
2*2+1
2*2+2
20 10 8 3 6 1 15
0 1 2 3 4 5 6
6/2-1
20 10 15 3 6 1 8
0 1 2 3 4 5 6
20
10 8
3 6 1 15
20
10 15
3 6 1 8
Insrer 15 ?
chercher le pre :
permuter si ncessaire :
Si pre i :
fils 1 2*i+1
fils 2 2*i+2
1MLVWMV insertionTas( t: tab ..., v: VMV )
1MMMV
1VM
V p: VMV
N <- N + 1
t[ N ] <- v /* ajout nouveau en fin de tableau */
i <- N
M @MV i<=1 et t[ i/2-1 ] <= v V@VV /* tant que pre <= nouveau */
t[ i ] <- t[ i/2-1 ] /* fait descendre le pre */
i <- i/2-1 /* pre suivant */
1M M @MV
t[ i ] <- v /* positionne nouveau */
1M
Benot Charroux - Tris - Septembre 98 - 31
Transformer en tas
20 10 8 3 6 1 15
0 1 2 3 4 5 6
6/2-1
20 10 15 3 6 1 8
0 1 2 3 4 5 6
chercher le pre :
permuter si ncessaire :
3URFpGXUHWriParTas( t: tab en entre sortie )
$OJRULWKPH
'pEXW
9DULDEOH i: HQWLHU
3RXUiGH1jNUpSpWHU
insertionTas( t, t[ i ] ) /* transformer en tas */
)LQSRXU
3RXUiGHNj0UpSpWHU
t[ i ] <- supprimerMax( t ) /* trier */
)LQSRXU
)LQ
Benot Charroux - Tris - Septembre 98 - 32
Trier
15
10 8
3 6 1
10 15
3 6 1 8
20
20
1MMLMM supprimerMax( t: tab en entre sortie ) : VMV
1MMMV
1VM
V i, j, v, max: VMV
max <- t[ 1 ]
t[ 1 ] <- t| N ] /* place le dernier lment en tte */
N <- N-1 /* supprime la dernire case (le max) */
/* reconstruire le tas */
VMM max
1M
Benot Charroux - Tris - Septembre 98 - 33
Supprimer le maximum 1/2
10 15
3 6 1 8
20
20
20 10 15 3 6 1 8
0 1 2 3 4 5 6
Benot Charroux - Tris - Septembre 98 - 34
Supprimer le maximum 2/2
/* reconstruire le tas */
v <- t[ 1 ]
7DQWTXH i <= N/2 UpSpWHU
j <- i+i /* j est le premier fils de i */
6L j<N et t[j]<t[j+1] DORUV /* si le deuxime fils est plus grand */
j <- j+1 /* on le garde */
)LQVL
6L v >= t[ j ] DORUV
EUHDN
)LQVL
t[ i ] <- t[ j ] /* change avec le plus grand des fils */
i <- j /* y a-til dautres fils ? */
)LQWDQWTXH
t[ i ] <- v
8 10 15 3 6 1
0 1 2 3 4 5 6
15 10 8 3 6 1
0 1 2 3 4 5 6
15
10 8
3 6 1
Tri par tas :
ncessite de l ordre de NlogN tapes pour trier N lments ;
pas de place mmoire supplmentaire ;
en moyenne deux fois plus lent que le tri rapide.
Benot Charroux - Tris - Septembre 98 - 35
Performance du tri par tas
Benot Charroux - Tris - Septembre 98 - 36
Comparaison des tris
Tri shell :
de lordre de N
3/2
comparaisons.
Tri rapide :
de lordre de NlogN oprations ;
de lordre de N
2
oprations dans le pire des cas.
Tri par fusion :
nombre de comparaison de lordre NlogN ;
place mmoire supplmentaire proportionnelle N.
Tri par tas :
ncessite de lordre de NlogN tapes ;
en moyenne deux fois plus lent que le tri rapide.
Le plus employ :
tri rapide
Le plus simple sur des
fichiers relativement gros
(-5000 lments) :
tri shell
Tri de listes chanes :
tri par fusion
Tri de fichiers
partiellement tris :
tri par tas