David SimoninietSébastien Verel
vereli3s.unie.fr
www.i3s.unie.fr/
∼
verelÉquipeSoBi-UniversitédeNieSophia-Antipolis
14 mars2008
Objetifs de la séane 8
1
Connaîtrele prinipe etl'interêtdesalgorithmesde tri
2
Algorithmede triparséletions etpermutations
3
Algorithmede triparinsertions
4
Algorithmede trirapide
Questions prinipales dujour :
Comment mettreunpeu d'ordredansesdonnées?
Plan
1
Prinipeet interêts
2
Triparseletionset permutations
3
Triparinsertions
4
Trirapide
Reherhe dihotomique
0 1 2 3 4 5 6 7 8
3 3 10 11 12 12 12 15 15
La tehniqueonsisteà:
Tester l'élémentdumilieu dutableau
à reherher àdroitesi l'élémentàreherher est plusgrand
ou à reherherà gauhesi l'élémentàreherher est pluspetit
Reherhe dihotomique
Algorithme reherheDihotomique(x:entier,t:tableaud'entier,n:
entier): booleen
début
variable a,b,:entier
a
←
0b
←
n−
1
← (
a+
b)/
2tantque a
≤
bett[
] 6=
x fairesit
[
] <
x alorsa
←
+
1sinon
b
←
−
1n si
← (
a+
b)/
2n tantque
retourner a
≤
bExemple
reherhe(10, t, 9)
0 1 2 3 4 5 6 7 8
3 3 10 11 12 12 12 15 15
a b
10
<
t[
]
don :0 1 2 3 4 5 6 7 8
3 3 10 11 12 12 12 15 15
a b
Nombre de omparaisons
Supposons quen
=
2α
et notonsT(
n)
le nombrede omparaisons pour unsous-tableaude taillen.T
(
n) =
T(
n2
) +
1T
(
n) =
T(
n4
) +
1+
1T
(
n) =
T(
n8
) +
1+
1+
1. . .
T
(
n) =
T(
1) + α
T
(
n)
estde l'ordre delog2(
n)
.Pour n
=
109 nous avonsT(
n) ≈
30Alorsquepour lareherheitérativele nombred'opérationest de
l'ordre n
/
2≈
0.
5 109.Idée et intérêts
Pour ungrandnombre de reherhesdansun tableau
(imaginer lespagesjaunes...), l'idée est d'abordde trier le
tableau avant d'eetuerunereherhe.
attention :ilfautalorsprendreen ompte leoûtdutri du
tableau
Il existe d'autressituationsoù ilest intéressantde trier les
données :
Représentationd'objeten 3D
lassiation de mails,hiers,textos...
basesde données
Prinipe des tris
le trid'un tableau s'eetue dansletableau lui-même
pas de réationde tableau supplémentaire quioupede la
mémoiresupplémentaire.
Larapidité d'untri dépend dutableau àtrier:
Parexemple, letableau initialpeut êtrepratiquement trié
Tri Séletion/permutation : permutation ave le plus petit
élément
12 4 3 78 12 3 9 11 12
∧
3 4
12
78 12 3 9 11 12
∧
3
3
12 78 12
4
9 11 12
∧
3 3
4
78 12
12
9 11 12
∧
3 3 4
9
12 12
78
11 12
∧
L'algorithme
En supposantdans unpremiertempsque indieMinetpermuter
sont dénis.
Algorithme triSelet(t:tableau d'entier, n :entier) :rien
début
variable i,jMin :entier
pour ide 0 àn-2 faire
jMin
←
indieMin(t, n,i) permuter(t, i,jMin)npour
n
la boule s'arrêteà l'indien
−
2,puisquele derniernombre estnéessairement le plusgrand.
L'algorithme
3
jMin i
12 4
3
Permutation de deux valeurs dans un tableau
Algorithme permuter(t:tableau d'entier;i, j :entier):rien
début
variable x :entier
x
←
t[
i]
t
[
i] ←
t[
j]
t
[
j] ←
xn
Reherhe de l'indie du nombre le plus petit
iDeb 12 3 3
Algorithme indieMin(t:tableaud'entier, n :entier,iDep:
entier) :entier
début
variable i,iMin :entier
pour ide iDep à n-1faire
si t
[
i] <
t[
iMin]
alorsiMin
←
insi
npour
retourneriMin
n
Faux :premier élémentàinitialiser
Reherhe de l'indie du nombre le plus petit
Algorithme indieMin(t:tableaud'entier, n :entier,iDep:
entier) :entier
début
variable i,iMin :entier
iMin
←
iDeppour ide iDep+1 àn-1 faire
si t
[
i] <
t[
iMin]
alorsiMin
←
insi
npour
retourneriMin
n
Nombre d'opérations
Chaque reherhe d'indiedemande n
−
i omparaisonsOr, ily an itérationsde la reherhed'indie,d'où :
P
n−
1i
=
0(
n−
i) = P
ni
=
1i=
n(
n+
1)
2
Pour n
=
106,de l'ordrede 0.
5 1012!Mêmeà 0.1milliseondeparopération... n'essayez même pas.
En Maple
Algorithme triSelet(t : tableau d'en-
tier,n:entier):rien
début
variable i,jMin:entier
1: pouride0àn-2faire
2: jMin
←
indieMin(t,n,i) 3: permuter(t,i,jMin)4: npour
n
triSelet := pro(t, n)
# t : tableau d'entiers
# n : entier, taille du tableau
# sortie : auune, tri dans t
loal i, jMin;
1. for i from 1 to n-2 do
2. jMin := indieMin(t,n,i);
3. permuter(t, i, jMin);
4. od:
end;
En Maple
Algorithme permuter(t:tableaud'en-
tier;i,j:entier):rien
début
variable x:entier
1: x
←
t[
i]
2: t
[
i] ←
t[
j]
3: t
[
j] ←
xn
permutater := pro(t, i, j)
# t : tableau d'entiers
# i,j : entier, indies à permuter
# sortie : auune, permutation dans t
loal x;
1. x := t[i℄;
2. t[i℄ := t[j℄;
3. t[j℄ := x;
end;
En Maple
Algorithme indieMin(t:tableaud'en-
tier,n:entier,iDep:entier):entier
début
variable i,iMin:entier
1: pourideiDepàn-1faire
2: sit
[
i] <
t[
iMin]
alors3: iMin
←
i4: nsi
5: npour
6: retourneriMin
n
indieMin := pro(t, n, iDep)
# t : tableau d'entiers
# n : entier, taille du tableau
# iDep : entier, premier indie de reherhe
# sortie : entier, indie du minimum de t
loal i, iMin;
1. for i from iDep to n - 1 do
2. if t[i℄ < t[iMin℄ then
3. iMin := i;
4. fi;
5. od;
6. RETURN(iMin);
end;
Prinipe : insertion de l'élément ourant dans le
sous-tableau trié
12
4 3 78 12 3 9 11 12
∧
4 12
3 78 12 3 9 11 12
∧
3 4 12
78 12 3 9 11 12
∧
3 4 12 78
12 3 9 11 12
∧
3 4 12 12 78
3 9 11 12
∧
D.Simonin,S.Verel Algorithmesdetri
L'algorithme
Algorithme triInsertion(t:tableaud'entier, n :entier) :rien
début
variable i:entier
pour ide 1 àn-1 faire
inserer(t,i)
npour
n
labouleommeneàl'indie1,puisquelepremier nombreestdéjà
en plae.
Algorithme insertion
Insère lenombred'indiei dansle sous-tableaude l'indie0 etài.
Le tableau de l'indie0 età i
−
1est supposétriédansl'ordreroissant.
Algorithme inserer(t :tableau d'entier, i:entier) :rien
début
variable j
,
x :entierx
←
t[
i]
j
←
i-1tant que0
≤
j ETx≤
t[
j]
fairet
[
j+
1] ←
t[
j]
j
←
j−
1ntant que
t
[
j+
1] ←
xn
Exemple d'insertion : inserer(t,4)
3 4 12 78
4 3 9 11 12
∧
3 4 12 78 78
3 9 11 12
∧
3 4 12 12 78
3 9 11 12
∧
3 4 4 12 78
3 9 11 12
∧
3 4 4 12 78 3 9 11 12
∧
[ ]
Nombre d'opérations
Chaque reherhe insertiondemandei
/
2omparaisons en moyenneOr, ily an itérationsde l'insertion,le nombrede omparaisonsest
don en moyenne :
P
n−
1i
=
0 i/
2=
n(
n+
1)
4
Pour n
=
106,de l'ordrede 0.
25 1012 en moyenne!En Maple
Algorithme triInsertion(t : tableau
d'entier,n:entier):rien
début
variable i:entier
1: pouride1àn-1faire
2: inserer(t,i)
3: npour
n
triInsertion := pro(t, n)
# t : tableau d'entiers
# n : entier, taille du tableau
# auune : tri dans t
loal i;
for i from 1 to n-1 do
inserer(t,n,i);
od:
end;
En Maple : inserer
Algorithme inserer(t:tableaud'entier;
i:entier):rien
début
variable j
,
x :entier1: j
←
i-12: x
←
t[
i]
3: tantque0
≤
j ETx≤
t[
j]
faire4: t
[
j+
1] ←
t[
j]
5: j
←
j−
16: ntantque
7: t
[
j+
1] ←
xn
inserer := pro(t, i)
# t : tableau d'entiers
# i : entier, borne d'insertion
# sortie : auune, insertion dans t
loal j;
j := i-1;
x := t[i℄;
while 0 <= j and t[j℄ <= x do
t[j+1℄ := t[j℄;
j := j - 1;
od:
t[j+1℄ := x;
end;
Prinipe
Le tri rapide(enanglais quiksort) estune méthode de triinventée
parC.A.R. Hoareen 1962 baséesur laméthode diviserpour
régner.
Il onsiste àhoisir unnombrepivotdansle tableau,
à partionner en deux letableau ave:
les nombres pluspetitsà gauhedunombre pivotet
les nombres plusgrands àdroite dunombrepivot
et d'itérerle proessussur lessous-tableaux obtenus.
Prinipe
Voirlesanimations de lapage web :
http://lwh.free.fr/pages/algo/tri/tri.htm
L'algorithme
Algorithme triRapide(t:tableaud'entier;rst,last:entier):rien
début
variable iPivot:entier
sirst <lastalors
iPivot
←
partionner(t,rst, last) triRapide(t,rst, iPivot)triRapide(t,iPivot+1, last)
nsi
n
Algorithme : partitionner
Partionne en deuxdusous tableau entrerst etlast :
les nombrespluspetitquelenombrepivotsontàgauhe dee
nombre
les nombresplus grandquele nombrepivotsontàdroitede e
nombre
Algorithme partionner (1)
Algorithme partionner(t:tableaud'entier,rst,last:entier):entier
début
variable i,j,pivot:entier
pivot
←
t[rst℄i
←
rst-1j
←
last+1tant quei<jfaire
j
←
j-1tantquet
[
j] >
pivotfairej
←
j-1ntant que
i
←
i+1tantquet
[
i] <
pivotfairei
←
i+1ntant que
sii<jalors
permuter(t,i,j)
nsi
ntantque
Algorithme partionner (2)
(...)
tant quei<jfaire
j
←
j-1tantquet
[
j] >
pivotfairej
←
j-1ntant que
i
←
i+1tantquet
[
i] <
pivotfairei
←
i+1ntant que
sii<jalors
permuter(t,i,j)
nsi
ntantque
retourner(j)
n
Nombre d'opérations
Le nombremoyen d'opérationsest de l'ordrenlog
2
(
n)
Dans lepire desas,e nombre estn 2
.
On doit eetuerk reherhes dansununtableau nonordonnéde
taillen :
Est-il intéressantde triere tableau avantd'eetuer lareherhe?
En Maple : triRapide
Algorithme triRapide(t:tableaud'en-
tier;rst,last:entier):rien
début
variable iPivot:entier
1: sirst<lastalors
2: iPivot
←
partionner(t,rst,last) 3: triRapide(t,rst,iPivot)4: triRapide(t,iPivot+1,last)
5: nsi
n
triRapide := pro(t, first,
last)
# t : tableau d'entiers
# first, last : entier, borne du
sous-tableau à trier
loal iPivot;
if first < last then
iPivot := partionner(t,
first,
last);
triRapide(t, first, iPivot);
triRapide(t, iPivot + 1, last);
fi;
end;
En Maple : partitionnner
partitionner := pro(t, n, first,
last)
# t : tableau d'entiers
# n : entier, taille du tableau
# first, last : entier,
borne du sous-tableau à trier
loal pivot, i, j;
pivot := t[first℄;
i := first - 1;
j := last + 1;
while i < j do
j := j - 1;
while pivot < t[j℄ do
j := j - 1;
od;
i := i + 1;
while t[i℄ < pivot do
i := i + 1;
od;
if i < j then
permuter(t, i, j);
fi;
od;
RETURN(j);
end;
Exeries
Supprimerunélément dansuntableaunon ordonné en
déalant tousles élémentsnéessaires versla gauhe.
Trier dansl'ordredéroissantuntableau d'entiersparle tripar
séletion/permutation
Appliquerle tri rapidesur letableau ontenantdanset ordre
5,4,3,2,1.
Objetifs de la séane 8
1
Connaîtrele prinipe etl'interêtdesalgorithmesde tri
2
Algorithmede triparséletions etpermutations
3
Algorithmede triparinsertions
4
Algorithmede trirapide
Questions prinipales dujour :
Comment mettreunpeu d'ordredansesdonnées?