Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
VARI
LES TRIS
PLAN
Le problme du tri
Le tri par insertion
Le tri fusion
Le tri par tas
Le tri rapide
Comparaison des tris
Le tri par dnombrement
1
4.1
LE PROBLEME DU TRI
4-1-1
DFINITION
entre:
suite de n lments
sortie:
permutation de la suite
e'1, e'2, .., e'n
e'1 e'2 .. e'n
cls, , alphabet,..
2
4-1-2
IMPLMENTATION
en O(n2)
faire
Si on veut trier des lments (classe Elt), le tri doit se faire sur les cls des
lments. Pour simplifier la prsentation, dans ce chapitre, on trie des entiers et
on utilise donc des tableaux d'entiers. On pourrait aussi utiliser des tableaux de
cls (CCl) ou des tableaux d'lments (Elt).
classe CTab{
entier taille;
entier [ ] tab;
entier long=0;
//taille du tableau
//ce tableau contient des entiers
//nombre d'lments dans le tableau
4-2
principe:
4-2-1
INSERTION SQUENTIELLE
EXEMPLE
7 15 8 10 5 17
7 15 8 10 5 17
7 8 15 10 5 17
7 8 10 15 5 17
//dcalage droite de 15
//dcalage droite de 15
//dcalage droite de 7, 8, 10 et 15
5 7 8 10 15 17
5 7 8 10 15 17
7
implmentation
void
tri_inser_seq ( )
j = 2 long faire
cl = tab[j] ; //cl placer
i = j-1 ;
tant que i > 0 et tab[i] > cl faire
//dcalage vers la droite
tab[i+1] = tab[i] ;
i = i-1 ;
fait;
complexit
pire des cas
-boucle pour : j de 2 n (=long)
-itration j,
boucle tant que : j fois
O(2 + 3 +..+ n) oprations
insertion squentielle en O(n2)
9
complexit
en moyenne
-boucle pour : j de 2 n
-itration j,
boucle tant que : j/2 fois
O(2 + 3 +..+ n)/2 oprations
en moyenne en O(n2)
10
chaque itration:
recherche de la place en O(log n)
mais dplacements en O(n)
complexit en O(n2)
11
4-2-3COMPLEXIT EN MMOIRE
12
4-3
4-3-1
LE TRI FUSION
LA FUSION
fusion de 2 listes ordonnes
13
T1 1 4 5 6 9
T2 2 3 4
T
T1 1 4 5 6 9
T2 2 3 4
T 1 2 3 4
T1
T2 2
T1 1 4 5 6 9
T2 2 3 4
T 1
T1 1 4 5 6 9
T1 1 4 5 6 9
T2 2 3 4
T2 2 3 4
T 1 2 3
T 1 2 3 4
5 6 9
3 4
1 2 3 4 4
UN EXEMPLE
T1 1 4 5 6 9
T2 2 3 4
T 1 2
T1 1 4 5 6 9
T2 2
3 4
1 2 3 4 4 5 6 9
14
T1 1 4 5 6 9
T2 2 3 4
n1 termes
n2 termes
Tant quil reste des lments dans les deux tableaux
on slectionne le plus petit
T1
T2 2
5 6 9
3 4
1 2 3 4 4
UN EXEMPLE suite
i
j
T1
4 5 6
T2
3 4
1 2 3 4 4 5 6 9
15
CIndice
i, j, k = 1;
dbut
n1=t1.long; n2=t2.long;
tant que i n1 et j n2 faire //jusqu' "avoir vid" l'un des 2 tableaux
si
tableaux
t.tab[k] = t1.tab[i] ;
i = i+1 ;
sinon
t.tab[k] = t2.tab[j] ;
j = j+1 ;
finsi;
k := k+1 ;
fait;
16
5 2 4 6 1 3 2 6
5 2 4 6
5 2
5
1 3 2 6
4 6
4
1 3
6
2 6
3
Division
19
1 2 2 3 4 5 6 6
2 4 5 6
2 5
5
1 2 3 6
4 6
4
1 3
6
2 6
3
Fusion
20
"descente" division
"remonte" fusion
EXEMPLE
1 2 2 3 4 5 6 6
5 2 4 6 1 3 2 6
fusion
fusion
division
2 4 5 6
5 2 4 6
fusion
division
fusion
fusion
4 6
4 6
2 5
5 2
f
1 2 3 6
1 3 2 6
division
1 3
1 3
f
fusion
2 6
2 6
f
6
21
a h n o p r v
b f s w c k t
b c f k s t w
un seul tableau
void tri-fusion
CIndice
d, m, g ;
dbut
finsi ;
fin ;
appel:
tri "sur place":
tri-fusion(t.tab,1,n);
complexit mmoire en O(1)
23
4-2-3
COMPLEXIT ET RCURRENCE
a) complexit du tri-fusion
nombre d'lments
par sous-tableau
( 1 prs)
N
niveau 1
N/2
N/2
.
.
.
k = 2I
N/k... ... ... ... ...N/k
niveau I
noeuds
.
.
.
.
k=N
niveau log2N 1 1 ... ... ... ... ... ... 1 1 noeuds
niveau I:
complexit du tri-fusion
O(n log n)
tri-fusion = trs bon tri
b)complexit des algorithmes rcursifs (facultatif)
relation de rcurrence
(n): O(temps d'excution pour n)
- "diviser"
O(1)
- "rgner"
2 (n/2)
- fusionner
O(n)
(n) =
O(1)
2 (n/2)+O(n)
si n = 1
si n > 1
autres rsultats
(n) = O(logn)
(n) = 2(n/2)+cn
(n)=O(nlogn)
(n) = 2(n/2)+cn2
(n) = O(n2)
(n) = 4(n/2)+cn2
(n) = O(n2logn)
27
L'ALGORITHME
estvide, min_tas,
insrer, supprimer_min
28
tri_par_tas (CTab l)
entier val; C_Tas letas= new C_Tas (l.long) ; entier n=l.long;
void
dbut
pour
fait ;
pour k=1 n faire
//slection successive des min du tas qui sont reports leur place dans l
val = letas.min_tas;
l.tab[k]= val ;
//suppression du min en gardant la structure de tas
letas.supprimer_min;
fait ;
fin ;
30
tri_par_tas (CTab l)
entier val; C_Tas letas= new C_Tas (l.long) ; entier n=l.long;
void
dbut
pour
k=1 n faire
val = l.tab[k];
letas.insrer (val) ; O(log n)
n fois
fait ;
k=1 n faire
val = letas.min_tas; O(1)
l.tab[k]= val ;
letas.supprimer_min; O(log n)
pour
n fois
fait ;
fin ;
31
4-4-2 COMPLEXIT
-n itrations pour chaque boucle
-insrer et supprimer en O(log n)
complexit du tri par tas
O(n log n)
espace mmoire: ici O(n)
mais, tri "sur place" possible avec programmation
de mme principe un peu plus complexe
4-5
LE TRI RAPIDE
(implmentation non tudie ici)
principe
pivot
>
> >
change
pivot
change
tri-rapide
place
dfinitive
tri-rapide
33
LE TRI RAPIDE
10
12
18
15
12
10
18
15
12
10
18
15
12
10
18
15
34
LE TRI RAPIDE
12
10
10
18
15
12
10
18
15
10
12
15
18
12
15
18
35
procdure rcursive :
37
38
tri fusion
sur micro
1 mips
si n = 106
tri du super-ordinateur (insertion):
2.(106)2/108 = 20 000 sec = 5,56h
40
0,2s
0,9s
4,4s
1,6s
24s
6,6mn
types de
tris
slection
insertion
fusion
par tas
rapide
complexit
au pire
moyenne
n2
n2
n2
n2
nlogn
nlogn
nlogn
nlogn
nlogn
n2
Conclusion
tri par tas: meilleure complexit
tri rapide et tri fusion: efficaces
tri par insertion excellent si liste initiale
presque trie
et
tri par slection donne le dbut de liste tri
avant la fin du tri
tri par insertion peut dbuter sans liste initiale
complte
43
PRINCIPE
alphabet {1,..,26}
45
4-7-2 PROCDURE
A: tableau de n entier; trier
B: tableau de n entier; rsultat
k=
47
//C[i] contient le nombre d'lments gaux ou < i
//il reste placer les lments dans B
pour j :=n 1 pas -1 faire
B[C[A[j]]] := A[j];
//l'lment A[j] doit tre mis dans B la place C[A[j]]
C[A[j]] := C[A[j]]-1;
//cas d'galit de 2 lments: le deuxime est en C[A[j]]-1
fait;
retourner B;
fin
48
EXEMPLE
i= 1 2 3 4
5 6 7
A 3 6 4 1 3 4 1 4
k=6
C 2 0 2 3 0 1
nombre d'lments = i
C 2 2 4 7 7 8
nombre d'lments i
1 2 3 4
5 6 7
B 1 1 3 3 4 4 4 6
5 2 8 4 6
3 1
ordre de remplissage
49
50
4-7-3
REMARQUES DIVERSES