Académique Documents
Professionnel Documents
Culture Documents
Polytech’Nice-Sophia
Département Sciences Informatiques
930 route des Colles
06903 Sophia Antipolis - France
Tris rapides et rangs
Présentation
Files de priorité (tas)
Tri par tas (heapsort)
Tri rapide (quicksort)
Tri fusion
Optimalité
ASD 2 – p.1/73
Tris : contexte
ASD 2 – p.2/73
Tris : propriétés
ASD 2 – p.3/73
Tris : méthodes quadratiques
Propriétés
ASD 2 – p.4/73
Tris : méthodes quasi-linéaires
heapsort en anglais
inventé par Williams en 1964
basé sur une structure de donnée très utile, la file de
priorité
complexité bornée par Θ(n lg n) quelle que soit la
configuration initiale du tableau
tri en place
mise en œuvre très simple
ASD 2 – p.6/73
Tri par tas : tri par sélection
T <
ASD 2 – p.7/73
Tri par tas : tri par sélection
T <
ASD 2 – p.8/73
Tas : arbre parfait
ASD 2 – p.9/73
Tas : arbre parfait
ASD 2 – p.10/73
Tas : arbre parfait
ASD 2 – p.11/73
Tas : arbre parfait
n=8 n = 15
Exercice
Montrer que la hauteur h d’un arbre parfait est ⌊lg n⌋.
ASD 2 – p.12/73
Tas : arbre parfait
0 A
1 x 2 y
3 M 4 N 5 O 6 P
7 8 9 10 11
h i j k l
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A x y M N O P h i j k l
ASD 2 – p.13/73
Tas : arbre parfait
ASD 2 – p.14/73
Tas : arbre parfait
Représentation
Exercices
ASD 2 – p.16/73
Tas : arbre ordonné
ASD 2 – p.17/73
Tas : arbre ordonné
Exemple
37
29 21
28 18 9 19
11 15 16 12
ASD 2 – p.18/73
Tas : file de priorité
ASD 2 – p.19/73
Tas : file de priorité
Exemple
37
29 21
28 18 12 19
16 9 11 15
ASD 2 – p.20/73
Tas : file de priorité
10 37 29 21
5 17 29 41 28 18 12 19
3 8 14 20 16 9 11 15
ABR TAS
ASD 2 – p.21/73
Tas : accès au maximum
0 T[0]
37
29 21
18 28 12 19
16 9 11 15 10
ASD 2 – p.22/73
Tas : extraire le maximum
0 37
10
29 21
18 28 12 19
N−1
16 9 11 15 10
ASD 2 – p.23/73
Tas : tasser
10 29
29 21 10 21
18 28 12 19 18 28 12 19
16 9 11 15 16 9 11 15
29 29
28 21 28 21
18 10 12 19 18 15 12 19
16 9 11 15 16 9 11 10
ASD 2 – p.24/73
Tas : ajout d’un élément
37
29 21
28 18 12 19
(N−1)+1
16 9 11 15 45
ASD 2 – p.25/73
Tas : ajout d’un élément
37 37
29 21 29 21
28 18 12 19 28 18 45 19
16 9 11 15 45 16 9 11 15 12
37 45
29 45 29 37
28 18 21 19 28 18 21 19
16 9 11 15 12 16 9 11 15 12
ASD 2 – p.26/73
Tas : exercices
ASD 2 – p.27/73
Tri par tas : principe
0 taille T.length
T <
ASD 2 – p.28/73
Tri par tas : le tas initial
N−1 pere(N−1)
ASD 2 – p.29/73
Tri par tas : complexité
ASD 2 – p.30/73
Tri par tas : complexité
X n
⌊lg n⌋
X h
⌊lg n⌋
X∞
k
h
Θ(h) = Θ(n ) ≤ Θ(n hk ) = Θ(n 2
)
h=0
2h
h=0
2h
h=0
(1 − k)
ASD 2 – p.31/73
Tri par tas : complexité
ASD 2 – p.32/73
Tri par tas : exercices
Feuille de TD8
ASD 2 – p.33/73
Tri rapide : introduction
quicksort en anglais
inventé par Hoare en 1960
appelé aussi le tri des bijoutiers ou tri de perles
l’exemple le plus célèbre de la technique diviser pour
régner
basé sur des méthodes de partionnement de tableau
tri en place
un dérivé intéressant : la recherche d’un rang
statistique
ASD 2 – p.34/73
Tri rapide : principe
Tri récursif
0 i j T.length−1
Partitionner
0 i p j T.length−1
Trier Trier
i p−1 p p+1 j
ASD 2 – p.35/73
Tri rapide : partition
∀g, i ≤ g < p, ∀d, p < d ≤ j, clef(T [g]) < clef(T [p]) ≤ clef(T [d])
ASD 2 – p.36/73
Tri rapide : partition
Partitionner
T < >
− ?
traitement final :
i p j k
T < >
−
ASD 2 – p.37/73
Tri rapide : partition
Exemple
i j i k j i k j
4 2 5 1 7 3 6 4 2 5 1 7 3 6 4 2 5 1 7 3 6
p p
i k j i k j i k j
4 2 5 1 7 3 6 4 2 1 5 7 3 6 4 2 1 5 7 3 6
p p p
i j i j k i j
4 2 1 3 7 5 6 4 2 1 3 7 5 6 3 2 1 4 7 5 6
p k p p
Exercice
Écrivez la méthode de partition qui prend en paramètres
les indices i et j, partitionne T [i..j], et retourne l’indice p.
ASD 2 – p.38/73
Tri rapide : le tri
ASD 2 – p.39/73
Tri rapide : méthodes
Méthode principale
public void t r i e r ( ) {
t r i e r (0 ,T . length − 1 ) ;
}
Méthode récursive
p r i v a t e void t r i e r ( i n t i , i n t j ) {
if ( i < j ) {
int p = partitionner ( i , j ) ;
t r i e r ( i , p −1);
t r i e r ( p+1 , j ) ;
}
}
ASD 2 – p.40/73
Tri rapide : exemple
4 10 7 2 6 9 5 1 8 3
3 1 2 4 6 9 5 7 8 10
1 2 3 4 5 6 9 7 8 10
1 2 3 4 5 6 8 7 9 10
1 2 3 4 5 6 7 8 9 10
ASD 2 – p.41/73
Tri rapide : complexité
2 X n/2 = n
lg(n)
4 X n/4 = n
...... = n
=⇒ complexité = Θ(n lg n)
ASD 2 – p.42/73
Tri rapide : complexité
n−1
n−2 n−1
n−3
.......
1
Exercices
ASD 2 – p.44/73
Tri rapide : complexité
en moyenne : ?
ASD 2 – p.45/73
Tri rapide : complexité
ASD 2 – p.46/73
Tri rapide : complexité
p n−p−1
ASD 2 – p.47/73
Tri rapide : complexité
La complexité en moyenne du tri rapide est
1 X
n−1
Cn = n − 1 + (Cp + Cn−p−1 )
n p=0
2 X
n−1
Cn = n − 1 + Cp
n p=0
Exercice
Montrer que cette expression se réduit à
Cn ≈ 2nHn (≈ 1, 38 n lg n)
ASD 2 – p.48/73
Tri rapide : améliorations
Choix du pivot
Choix de l’élément médian parmi trois
Petites tranches
Utilisation d’un tri naïf (insertion) sur les tranches de
longueur inférieure à k (k ≈ 20)
ASD 2 – p.49/73
Tri rapide : exercices
Feuille de TD8
ASD 2 – p.50/73
Rang : définition
l’élément de rang k
le k-ième plus petit élément
l’élément d’indice k − 1 dans le tableau trié
sous l’hypothèse
ASD 2 – p.51/73
Rang : méthodes
Méthode naïve
On trie le tableau en Θ(n lg n) et on trouve le rang en Θ(1)
Méthode rapide
Algorithme destructif basé sur le partitionnement
les éléments du tableau sont conservés mais déplacés
moitié du tri rapide
à la fin, l’élément de rang k occupe la place qu’il
occuperait dans le tableau trié, à l’indice k − 1
ASD 2 – p.52/73
Rang : méthode rapide
0 k T.length−1
partitions : 1 3 5 76 4 2
ASD 2 – p.53/73
Rang : méthodes
Méthode principale
public O b j e t A C l e f rang ( i n t k ) {
r e t u r n rang ( 0 , T . l e n g t h − 1 , k − 1 ) ;
}
Méthode récursive
p r i v a t e O b j e t A C l e f rang ( i n t i , i n t j , i n t k ) {
i f ( i == j ) r e t u r n T [ i ] ;
int p = partitionner ( i , j ) ;
i f ( k < p ) r e t u r n rang ( i , p−1,k ) ;
i f ( k > p ) r e t u r n rang ( p+1 , j , k ) ;
return T [ p ] ;
}
ASD 2 – p.54/73
Rang : exemple
3 1 2 4 6 9 5 7 8 10
1 2 3
1 2
ASD 2 – p.55/73
Rang : complexité
Cn = C n2 + Θ(n) =⇒ Cn = Θ(n)
en moyenne : ?
ASD 2 – p.56/73
Rang : complexité
ASD 2 – p.57/73
Rang : complexité
T
p
n−p−1
ASD 2 – p.58/73
Rang : complexité
1 X X
k−1 n−1
Cn = n − 1 + ( Cn−p−1 + Cp )
n
p=0 p=k+1
2 X
n−1
Cn ≤ n − 1 + Cp
n
p=⌈ n2 ⌉
ASD 2 – p.59/73
Rang : exercices
Exercices
Comment pourrait-on modifier le tri par sélection
pour obtenir un algorithme de recherche de l’élément
de rang k ?
Quelle est sa complexité dans le pire des cas ?
Qu’en est-il si l’on utilise un tas pour optimiser la
sélection ?
Feuille de TD8
ASD 2 – p.61/73
Méthode de fusion
0 g m d T.length
A 14 25 28 37 51 59 20 31 43 46 62
0 g m d T.length
B 14 20 25 28 31 37 43 46 51 59 62
ASD 2 – p.62/73
Tri fusion : principe
g m m+1 d g m m+1 d
A B
TV TV
F
g m m+1 d g d
B A
ASD 2 – p.63/73
Tri fusion : principe
g m m+1 d g m m+1 d
A A
TEP TEP
F
g m m+1 d g d
A B
ASD 2 – p.64/73
Tri fusion : exercices
Exercices
Dans quel cas un TEP n’a-t’il rien à faire ? Que doit
faire un TV dans ce même cas ?
Trier la table contenant initialement les clefs 53, 8,
57, 1, 90, 17, 89, 27 et 35.
L’ordre initial des éléments a-t’il un impact sur le
temps d’exécution du tri ? Que dire des cas n = 2m
et n = 2m + 1 ?
Feuille de TD8
8. Implémentation de la classe TriFusion.
ASD 2 – p.65/73
Comparaison des tris
16000
Temps moyen (1/1000 ms).
14000
12000
10000
8000
6000
4000
2000
0
5000 6000 7000 8000 9000 10000 11000 12000
Nombre d’éléments.
ASD 2 – p.66/73
Comparaison des tris
14000
Temps moyen (1/1000 ms).
12000
10000
8000
6000
4000
2000
0
5000 6000 7000 8000 9000 10000 11000 12000
Nombre d’éléments.
ASD 2 – p.67/73
Optimalité des tris comparatifs
Tri comparatif
Aucune hypothèse sur les clefs des éléments à trier,
nécessité de comparer les clefs entre elles
Algorithme de tri
ASD 2 – p.68/73
Arbre de décision : exemple
e0 ? e1
e1 ? e2 e0 ? e2
e0 e1 e2 e0 ? e2 e1 e0 e2 e1 ? e2
e0 e2 e1 e2 e0 e1 e1 e2 e0 e2 e1 e0
ASD 2 – p.69/73
Arbre de décision : exercices
ASD 2 – p.70/73
Arbre de décision : définition
ASD 2 – p.72/73
Tris rapides : synthèse
ASD 2 – p.73/73