Академический Документы
Профессиональный Документы
Культура Документы
Pour pouvoir comparer les méthodes de tris, on les appliquent à des tableaux d’entiers.
Tableau trié : 1 1 3 6 7 20
Indices : 0 1 2 3 4 5
&RQVWDQWH N
3URJUDPPHGHWUL 3URFpGXUH tri( t: tab en entrée sortie )
$OJRULWKPH $OJRULWKPH
'pEXW 'pEXW
tri( t )
)LQ
Il faut :
• 1 boucle pour parcourir le tableau et sélectionner tous les éléments ;
• 1 boucle pour rechercher le minimum parmi les éléments non triés.
'pEXW
min <- j
)LQVL
)LQSRXU
)LQ
20 6 1 3 1 7
6 20 1 3 1 7
1 6 20 3 1 7
1 3 6 20 1 7
1 1 3 6 20 7
1 1 3 6 7 20
Il faut :
• 1 boucle pour parcourir le tableau et sélectionner l’élément à insérer ;
• 1 boucle pour décaler les éléments plus grands que l’élément à insérer ;
• insérer l’élément.
'pEXW
t[ j ] <- t[ j-1 ]
j <- j - 1
)LQWDQWTXH
)LQ
'pEXW
...
7DQWTXH j>0 HW ... 5pSpWHU Le test j>0 qui évite les dépassements à
gauche du tableau est presque toujours vrai !
...
j <- j - 1
)LQWDQWTXH
...
)LQ
-1 20 6 1 3 1 7
20 6 6 6 6 6 1 1 1 1 1
6 20 1 1 1 1 6 3 3 3 1
Tableau
prit 1 1 20 3 3 3 3 6 1 1 ... 3
dans ce 3 3 3 20 1 1 1 1 6 6 6
sens
1 1 1 1 20 7 7 7 7 7 7
7 7 7 7 7 20 20 20 20 20 20
5 passes 4 passes
Il faut :
• 1 boucle pour parcourir tout le tableau et sélectionner les éléments un à un ;
• 1 boucle pour permuter les éléments adjacents.
Benoît Charroux - Tris - Septembre 98 - 9
'pEXW
)LQSRXU
)LQSRXU
)LQ
'pEXW 'pEXW
)LQSRXU )LQSRXU
)LQ )LQ
)LQSRXU
• N grand et éléments dans un ordre
)LQSRXU
aléatoire.
)LQ
'pEXW
)LQSRXU
)LQ
)LQSRXU
)LQ
'pEXW
Tableau trié en ordre inverse
3RXU i GH N-1 j 0 UpSpWHU /* boucle N fois */
3RXUj GH 1 ji UpSpWHU/* boucle i fois */
)LQSRXU
)LQSRXU
)LQ
3 2 23 1 20 6 0
3 2 23 1 20 6 0 ...
...
3 1 20 2 23 6 0
1 2 3 6 20 23 0
0 1 3 2 20 6 23
0 1 2 3 6 20 23
on obtient un tableau
entrelacé partiellement trié ;
Inconvénient : pour ramener un
élément de la fin vers la tête, il faut
• faire décroître h jusqu’à 1
décaler tous les éléments plus
grands. pour finir de trier le tableau.
43 21 8 65 6 1 3 34 7 20 11 51 54 27 9
h = 13 27 21 8 65 6 1 3 34 7 20 11 51 54 43 9
27 21 8 65 6 1 3 34 7 20 11 51 54 43 9
6 21 8 65 7 1 3 34 27 20 11 51 54 43 9
h=4 6 1 8 65 7 20 3 34 27 21 11 51 54 43 9
6 1 3 65 7 20 8 34 27 21 9 51 54 43 11
...
1 3 6 7 8 9 11 20 21 37 34 43 51 53 65
Le choix de h est empirique : le suite …, 364, 121, 40, 13, 4 et 1 est souvent utilisée.
'pEXW
7DQWTXH h > 0 UpSpWHU /* pour toute la suite …364, 121, 40, 13, 4, 1*/
/* tri par insertion d’éléments distant de h cases */
h <- h/3
3RXU i GH h+1 j N-1 UpSpWHU
)LQWDQWTXH
mem <- t[ i ]
)LQ
j <- i
7DQWTXH j>h HW t[j-h]>mem UpSpWHU
t[ j ] <- t[ j-h ]
j <- j - h
)LQWDQWTXH
t[ j ] <- mem
)LQSRXU
Benoît Charroux - Tris - Septembre 98 - 18
Performances du tri shell
Tri shell :
• N3/2 comparaisons au maximum pour la suite 1,
4, 13, 40, … ;
• actuellement, on ne connaît pas la complexité
en temps de cet algorithme.
❶ 20 6 1 3 1 7
❷ 1 6 1 3 7 20
❸ 1 6 1 3
❶ 1 6 1 3
❷ 1 1 3 6
Il faut :
• partitionner selon un pivot ;
• recommencer sur les partitions (récursion).
Benoît Charroux - Tris - Septembre 98 - 20
Algorithme du tri rapide
'pEXW
9DULDEOH p: HQWLHU
6L d > g DORUV
p <- partitionnement( t, g, d ) /* p = pivot */
triRapide( t, g, p-1 ) /* trier partie gauche */
triRapide( t, p+1, d ) /* trier partie droite */
)LQVL
)LQ
'pEXW
2 6 1 11 20 7
9DULDEOH i, j, p, tmp: HQWLHU
p <- t|d] /* pivot = élément de droite */
i <- g-1 /* i = curseur partant de la gauche */
j <- d /* j = curseur partant de la droite */
5pSpWHU
tmp <- t[i] t[i] <- t[j] t[j] <- tmp /* échange des éléments aux curseurs */
6DQVFRQGLWLRQ
tmp <- t[i] t[i] <- t[d] t[d] <- tmp /* déplacement du pivot à sa place */
UHWRXU i
)LQ
1 2 6 7 11 20
1 2 6 7 11
1 2 6 7
1 2 6
1 2
1
20 6 1 3 10 8 15 12
20 6 1 3 10 8 15 12
Division :
20 6 1 3 10 8 15 12
20 6 1 3 10 8 15 12
6 20
1 3
1 3 6 20
Fusion : 8 10
12 15
8 10 12 15
1 3 6 8 10 12 15 20
'pEXW
9DULDEOH m: HQWLHU
6L d > g DORUV
m <- (g+d) / 2
triFusion( t, g, m ) /* trier partie gauche */
triFusion( t, m+1, d ) /* trier partie droite */
… /* fusionner */
)LQVL
)LQ
g m d
tableau t : 1 3 6 20 8 10 12 15
tableau intermédiaire s : 1 3 6 20 15 12 10 8
Partie miroir de t
...
3RXU i GH m j g UpSpWHU
s[ i ] <- t[ i ]
)LQSRXU
...
Benoît Charroux - Tris - Septembre 98 - 26
Fusionner à l’aide d’un tableau intermédiaire
…
❶
k<-g i<-g j<-d
❷
7DQWTXH k <= d UpSpWHU /* parcours de t */
• tri idéal pour pour les listes chaînées (accès séquentiel) en changeant
la partie fusion de l’algorithme.
20
10 15 15
3 6 1 8 10 8
3 6 1
20
20 0 1 2 3 4 5 6
10 15
⇔ 20 10 15 3 6 1 8
2*2+1
3 6 1 8 2*2+2
3 6 1 15
⇔ 20 10 8 3 6 1 15
6/2-1
20 ❷ permuter si nécessaire :
0 1 2 3 4 5 6
⇔
10 15
20 10 15 3 6 1 8
3 6 1 8
Benoît Charroux - Tris - Septembre 98 - 30
Transformer en tas
❶ chercher le père :
0 1 2 3 4 5 6
3URFpGXUH insertionTas( t: tab ..., v: HQWLHU )
$OJRULWKPH
20 10 8 3 6 1 15
'pEXW
6/2-1
9DULDEOH p: HQWLHU
N <- N + 1
t[ N ] <- v /* ajout nouveau en fin de tableau */
i <- N
7DQWTXHi<=1 et t[ i/2-1 ] <= v UpSpWHU /* tant que père <= nouveau */
t[ i ] <- t[ i/2-1 ] /* fait descendre le père */
i <- i/2-1 /* père suivant */
)LQWDQWTXH
Trier
20
15
10 15
10 8
3 6 1 8
3 6 1
20
'pEXW
9DULDEOH i: HQWLHU
3RXUiGH1jNUpSpWHU
)LQ
Benoît Charroux - Tris - Septembre 98 - 32
Supprimer le maximum 1/2
20
10 15
3 6 1 8
20
)LQ
6L v >= t[ j ] DORUV
EUHDN
)LQVL
t[ i ] <- v
Benoît Charroux - Tris - Septembre 98 - 34
Performance du tri par tas