INAL 3 Les tris - · IDÉE FONDAMENTALE Une collection de valeurs de même type (rangées dans un...
Transcript of INAL 3 Les tris - · IDÉE FONDAMENTALE Une collection de valeurs de même type (rangées dans un...
LES ALGORITHMES DE TRIS
Lélia Blin Université d’Evry
Chargée de cours: Lélia Blin Transparents:http://www-npa.lip6.fr/~blin/Enseignements.html
Email: [email protected]
1
IDÉE FONDAMENTALE
Une collection de valeurs de même type (rangées dans un tableau)
Un opérateur de comparaison (≤,≥, >, <, …)
But :
Ré-ordonner les valeurs de la façon suivante
T[i] ≤ T[i+1] ∀ i ∈[1 .. Taillemax]
Lélia Blin Université d’Evry2
QUELQUES ALGORITHMES DE TRIS
Tris élémentaires
Tri par insertion
Tri par sélection
Tri par permutation
Tris avancés
Tri Fusion
Tri rapide
Borne Inférieure sur le tri par comparaison
Lélia Blin Université d’Evry3
TRI PAR INSERTION
Tri interne, sur place et par comparaison
Principe :
A tout moment, le tableau à trier sera en 2 parties :
Une partie triée [1 .. TailleCourante]
Une partie non triée [TailleCourante+1 .. TailleMax]
Lélia Blin Université d’Evry
1 2 3 4 5 ... ... ... ... ... TailleMAX
Eléments triés Eléments non triés
Taille Courante
4
TRI PAR INSERTION
Lélia Blin Université d’Evry
14 2 • Premiers pas
Sortie : permutation (réorganisation) ⟨a′1, a′2, . . . , a′n⟩ de la suite donnée en entrée,de façon que a′1 ! a′2 ! · · · ! a′n.
Les nombres à trier sont parfois appelés clés.
Dans cet ouvrage, nous exprimerons généralement les algorithmes sous la formede programmes écrits en un pseudo code qui, à certains égards, rappelle C, Pascalou Java. Si vous connaissez déjà l’un de ces langages, vous n’aurez guère de mal àlire nos algorithmes. Ce qui différencie le pseudo code du « vrai » code c’est que,avec le pseudo code nous employons l’écriture qui nous semble être la plus claireet la plus concise pour spécifier l’algorithme ; ne soyez donc pas surpris de voir ap-paraître un mélange de français et de « vrai » code. Autre différence entre pseudocode et vrai code : le pseudo code ne se soucie pas, en principe, de problèmes d’ingé-nierie logicielle tels qu’abstraction des données, modularité, traitement d’erreur, etc.Cela permet au pseudo code de refléter plus clairement la substantifique moelle del’algorithme.
Nous commencerons par le tri par insertion, qui est un algorithme efficace quand ils’agit de trier un petit nombre d’éléments. Le tri par insertion s’inspire de la manièredont la plupart des gens tiennent des cartes à jouer. Au début, la main gauche dujoueur est vide et ses cartes sont posées sur la table. Il prend alors sur la table lescartes, une par une, pour les placer dans sa main gauche. Pour savoir où placer unecarte dans son jeu, le joueur la compare avec chacune des cartes déjà présentes danssa main gauche, en examinant les cartes de la droite vers la gauche, comme le montrela figure 2.1. A tout moment, les cartes tenues par la main gauche sont triées ; cescartes étaient, à l’origine, les cartes situées au sommet de la pile sur la table.
2♣♣
♣ 2♣
4♣♣ ♣
♣♣ 4♣
5♣♣ ♣
♣♣ 5♣
♣
7♣
♣♣ ♣
♣ ♣
♣♣7
♣
10♣ ♣♣ ♣♣ ♣
♣♣♣♣♣
10♣
Figure 2.1 Tri de cartes à jouer, via tri par insertion.
Notre pseudo-code pour le tri par insertion se présente sous la forme d’une procé-dure appelée TRI-INSERTION. Elle prend comme paramètre un tableau A[1 . . n] qui
5
14 2 • Premiers pas
Sortie : permutation (réorganisation) ⟨a′1, a′2, . . . , a′n⟩ de la suite donnée en entrée,de façon que a′1 ! a′2 ! · · · ! a′n.
Les nombres à trier sont parfois appelés clés.
Dans cet ouvrage, nous exprimerons généralement les algorithmes sous la formede programmes écrits en un pseudo code qui, à certains égards, rappelle C, Pascalou Java. Si vous connaissez déjà l’un de ces langages, vous n’aurez guère de mal àlire nos algorithmes. Ce qui différencie le pseudo code du « vrai » code c’est que,avec le pseudo code nous employons l’écriture qui nous semble être la plus claireet la plus concise pour spécifier l’algorithme ; ne soyez donc pas surpris de voir ap-paraître un mélange de français et de « vrai » code. Autre différence entre pseudocode et vrai code : le pseudo code ne se soucie pas, en principe, de problèmes d’ingé-nierie logicielle tels qu’abstraction des données, modularité, traitement d’erreur, etc.Cela permet au pseudo code de refléter plus clairement la substantifique moelle del’algorithme.
Nous commencerons par le tri par insertion, qui est un algorithme efficace quand ils’agit de trier un petit nombre d’éléments. Le tri par insertion s’inspire de la manièredont la plupart des gens tiennent des cartes à jouer. Au début, la main gauche dujoueur est vide et ses cartes sont posées sur la table. Il prend alors sur la table lescartes, une par une, pour les placer dans sa main gauche. Pour savoir où placer unecarte dans son jeu, le joueur la compare avec chacune des cartes déjà présentes danssa main gauche, en examinant les cartes de la droite vers la gauche, comme le montrela figure 2.1. A tout moment, les cartes tenues par la main gauche sont triées ; cescartes étaient, à l’origine, les cartes situées au sommet de la pile sur la table.
2♣♣
♣ 2♣
4♣♣ ♣
♣♣ 4♣
5♣♣ ♣
♣♣ 5♣
♣
7♣
♣♣ ♣
♣ ♣
♣♣7
♣
10♣ ♣♣ ♣♣ ♣
♣♣♣♣♣
10♣
Figure 2.1 Tri de cartes à jouer, via tri par insertion.
Notre pseudo-code pour le tri par insertion se présente sous la forme d’une procé-dure appelée TRI-INSERTION. Elle prend comme paramètre un tableau A[1 . . n] qui
TRI PAR INSERTION
Nous commencerons par le tri par insertion
C’ est un algorithme efficace
quand il s’agit de trier un petit nombre d’éléments.
Le tri par insertion s’inspire de la manière
dont la plupart des gens tiennent des cartes à jouer.
Lélia Blin Université d’Evry6
14 2 • Premiers pas
Sortie : permutation (réorganisation) ⟨a′1, a′2, . . . , a′n⟩ de la suite donnée en entrée,de façon que a′1 ! a′2 ! · · · ! a′n.
Les nombres à trier sont parfois appelés clés.
Dans cet ouvrage, nous exprimerons généralement les algorithmes sous la formede programmes écrits en un pseudo code qui, à certains égards, rappelle C, Pascalou Java. Si vous connaissez déjà l’un de ces langages, vous n’aurez guère de mal àlire nos algorithmes. Ce qui différencie le pseudo code du « vrai » code c’est que,avec le pseudo code nous employons l’écriture qui nous semble être la plus claireet la plus concise pour spécifier l’algorithme ; ne soyez donc pas surpris de voir ap-paraître un mélange de français et de « vrai » code. Autre différence entre pseudocode et vrai code : le pseudo code ne se soucie pas, en principe, de problèmes d’ingé-nierie logicielle tels qu’abstraction des données, modularité, traitement d’erreur, etc.Cela permet au pseudo code de refléter plus clairement la substantifique moelle del’algorithme.
Nous commencerons par le tri par insertion, qui est un algorithme efficace quand ils’agit de trier un petit nombre d’éléments. Le tri par insertion s’inspire de la manièredont la plupart des gens tiennent des cartes à jouer. Au début, la main gauche dujoueur est vide et ses cartes sont posées sur la table. Il prend alors sur la table lescartes, une par une, pour les placer dans sa main gauche. Pour savoir où placer unecarte dans son jeu, le joueur la compare avec chacune des cartes déjà présentes danssa main gauche, en examinant les cartes de la droite vers la gauche, comme le montrela figure 2.1. A tout moment, les cartes tenues par la main gauche sont triées ; cescartes étaient, à l’origine, les cartes situées au sommet de la pile sur la table.
2♣♣
♣ 2♣
4♣♣ ♣
♣♣ 4♣
5♣♣ ♣
♣♣ 5♣
♣
7♣
♣♣ ♣
♣ ♣
♣♣7
♣
10♣ ♣♣ ♣♣ ♣
♣♣♣♣♣
10♣
Figure 2.1 Tri de cartes à jouer, via tri par insertion.
Notre pseudo-code pour le tri par insertion se présente sous la forme d’une procé-dure appelée TRI-INSERTION. Elle prend comme paramètre un tableau A[1 . . n] qui
TRI PAR INSERTION
Tri des cartes à jouer:
Au début, la main gauche du joueur est vide
et ses cartes sont posées sur la table.
Le joueur prend alors sur la table les cartes,
une par une,
pour les placer dans sa main gauche.
Lélia Blin Université d’Evry7
14 2 • Premiers pas
Sortie : permutation (réorganisation) ⟨a′1, a′2, . . . , a′n⟩ de la suite donnée en entrée,de façon que a′1 ! a′2 ! · · · ! a′n.
Les nombres à trier sont parfois appelés clés.
Dans cet ouvrage, nous exprimerons généralement les algorithmes sous la formede programmes écrits en un pseudo code qui, à certains égards, rappelle C, Pascalou Java. Si vous connaissez déjà l’un de ces langages, vous n’aurez guère de mal àlire nos algorithmes. Ce qui différencie le pseudo code du « vrai » code c’est que,avec le pseudo code nous employons l’écriture qui nous semble être la plus claireet la plus concise pour spécifier l’algorithme ; ne soyez donc pas surpris de voir ap-paraître un mélange de français et de « vrai » code. Autre différence entre pseudocode et vrai code : le pseudo code ne se soucie pas, en principe, de problèmes d’ingé-nierie logicielle tels qu’abstraction des données, modularité, traitement d’erreur, etc.Cela permet au pseudo code de refléter plus clairement la substantifique moelle del’algorithme.
Nous commencerons par le tri par insertion, qui est un algorithme efficace quand ils’agit de trier un petit nombre d’éléments. Le tri par insertion s’inspire de la manièredont la plupart des gens tiennent des cartes à jouer. Au début, la main gauche dujoueur est vide et ses cartes sont posées sur la table. Il prend alors sur la table lescartes, une par une, pour les placer dans sa main gauche. Pour savoir où placer unecarte dans son jeu, le joueur la compare avec chacune des cartes déjà présentes danssa main gauche, en examinant les cartes de la droite vers la gauche, comme le montrela figure 2.1. A tout moment, les cartes tenues par la main gauche sont triées ; cescartes étaient, à l’origine, les cartes situées au sommet de la pile sur la table.
2♣♣
♣ 2♣
4♣♣ ♣
♣♣ 4♣
5♣♣ ♣
♣♣ 5♣
♣
7♣
♣♣ ♣
♣ ♣
♣♣7
♣
10♣ ♣♣ ♣♣ ♣
♣♣♣♣♣
10♣
Figure 2.1 Tri de cartes à jouer, via tri par insertion.
Notre pseudo-code pour le tri par insertion se présente sous la forme d’une procé-dure appelée TRI-INSERTION. Elle prend comme paramètre un tableau A[1 . . n] qui
TRI PAR INSERTION
Pour savoir où placer une carte dans son jeu,
le joueur la compare avec chacune des cartes déjà présentes dans sa main gauche,
en examinant les cartes de la droite vers la gauche
A tout moment, les cartes tenues par la main gauche sont triées ;
ces cartes étaient, à l’origine, les cartes situées au sommet de la pile sur la table.
Lélia Blin Université d’Evry8
TRI PAR INSERTION: PRINCIPE
Prendre un élément non encore trié
L’insérer à sa place dans l’ensemble des éléments triés
Lélia Blin Université d’Evry
1 2 3 4 5 ... ... ... ... ... TailleMAX
Eléments triés Eléments non triés
Taille Courante
1 2 3 4 5 ... ... ... ... ... TailleMAX
Eléments triés Eléments non triés
Taille Courante
9
TRI INSERTION PSEUDO CODE
Lélia Blin Université d’Evry
TRI-INSERTION(A)
pour j ← 2 à longueur[A]
faire clé ← A[j]
i←j−1tant que i > 0 et A[i] > clé
faire A[i + 1] ← A[i]
i←i−1
A[i + 1] ← clé
10
Lélia Blin Université d’Evry
TRI-INSERTION(A)
pour j ← 2 à longueur[A]
faire clé ← A[j]
i←j−1tant que i > 0 et A[i] > clé
faire A[i + 1] ← A[i]
i←i−1
A[i + 1] ← clé
9 4 3 5 7 2 1
1 2 3 4 5 6 7
j =2 clé=4
‣ i=1: i > 0 et A[1]=9 > clé=4
‣A[i+1]=A[2] ← A[i] =A[1]=9
‣i=i-1=0
9 9 3 5 7 2 1
1 2 3 4 5 6 7
4 9 3 5 7 2 1
1 2 3 4 5 6 7
‣A[i+1]=A[1] ← clé=4
j =3 clé=3
‣ i=2: i > 0 et A[2]=9 > clé=3
‣A[i+1]=A[3] ← A[i] =A[2]=9
‣i=i-1=1
‣A[i+1]=A[1] ← clé=3
4 9 3 5 7 2 1
1 2 3 4 5 6 7
4 9 9 5 7 2 1
1 2 3 4 5 6 7
‣ i=1: i > 0 et A[1]=4 > clé=3
‣A[i+1]=A[2] ← A[i] =A[1]=4
‣i=i-1=0
4 4 9 5 7 2 1
1 2 3 4 5 6 7
3 4 9 5 7 2 1
1 2 3 4 5 6 7
j =4 clé=5
‣ i=3: i > 0 et A[3]=9 > clé=5
‣A[4] ← 9
‣A[3] ← clé=5
‣ i=2: i > 0 et A[2]=4 > clé=5
‣non
3 4 9 5 7 2 1
1 2 3 4 5 6 7
3 4 9 9 7 2 1
1 2 3 4 5 6 7
3 4 5 9 7 2 1
1 2 3 4 5 6 7
TRI PAR INSERTION : EXEMPLE
11
Lélia Blin Université d’Evry
TRI-INSERTION(A)
pour j ← 2 à longueur[A]
faire clé ← A[j]
i←j−1tant que i > 0 et A[i] > clé
faire A[i + 1] ← A[i]
i←i−1
A[i + 1] ← clé
j =5 clé=7
‣ i=4: i > 0 et A[4]=9 > clé=7
‣A[4] ← 9
‣A[4] ← clé=7
‣ i=3: i > 0 et A[3]=5 > clé=7
‣non
3 4 5 9 7 2 1
1 2 3 4 5 6 7
3 4 5 9 9 2 1
1 2 3 4 5 6 7
3 4 5 7 9 2 1
1 2 3 4 5 6 7
j =6 clé=2 j =7 clé=1
3 4 5 7 9 2 1
1 2 3 4 5 6 7
3 4 5 7 9 9 1
1 2 3 4 5 6 7
3 4 5 7 7 9 1
1 2 3 4 5 6 7
3 4 5 5 7 9 1
1 2 3 4 5 6 7
3 4 4 5 7 9 1
1 2 3 4 5 6 7
3 3 4 5 7 9 1
1 2 3 4 5 6 7
2 3 4 5 7 9 1
1 2 3 4 5 6 7
2 3 4 5 7 9 1
1 2 3 4 5 6 7
2 3 4 5 7 9 9
1 2 3 4 5 6 7
2 3 4 5 7 7 9
1 2 3 4 5 6 7
2 3 4 5 5 7 9
1 2 3 4 5 6 7
2 3 4 4 5 7 9
1 2 3 4 5 6 7
2 3 3 4 5 7 9
1 2 3 4 5 6 7
2 2 3 4 5 7 9
1 2 3 4 5 6 7
1 2 3 4 5 7 9
1 2 3 4 5 6 7
TRI PAR INSERTION : EXEMPLE
12
INVARIANT DE BOUCLE
Au début de chaque itération de la boucle pour
le sous-tableau A[1 . . j − 1]
se compose des éléments qui occupaient initialement
les positions A[1 . . j − 1]
mais qui sont maintenant triés.
Lélia Blin Université d’Evry13
INVARIANT DE BOUCLE DÉMONSTRATION
Nous devons montrer trois choses, concernant un invariant de boucle :
Initialisation :
Il est vrai avant la première itération de la boucle.
Conservation :
S’il est vrai avant une itération de la boucle,
il le reste avant l’itération suivante.
Terminaison :
Une fois terminée la boucle, l’invariant fournit une propriété utile qui aide à montrer la validité de l’algorithme.
Lélia Blin Université d’Evry14
INVARIANT DE BOUCLE REMARQUES
Si les deux premières propriétés sont vérifiées,
alors l’invariant est vrai avant chaque itération de la boucle.
La troisième propriété est peut-être la plus importante:
Elle est utilisé pour prouver la validité de l’algorithme.
Lélia Blin Université d’Evry15
INVARIANT DE BOUCLE INITIALISATION
Commençons par montrer que:
l’invariant est vérifié avant la première itération de la boucle, quand j = 2.
Le sous-tableau A[1 . . j−1] se compose donc
uniquement de l’élément A[1]
Autrement dit l’élément originel de A[1].
En outre, ce sous-tableau est trié (c’est une trivialité),
ce qui montre bien que l’invariant est vérifié
avant la première itération de la boucle.
Lélia Blin Université d’Evry16
INVARIANT DE BOUCLE CONSERVATION
Passons ensuite à la deuxième propriété :
Il faut montrer que chaque itération conserve l’invariant.
De manière informelle:
le corps de la boucle pour extérieure fonctionne:
en déplaçant A[j − 1], A[j − 2], A[j − 3], etc.
d’une position vers la droite
jusqu’à ce qu’on trouve la bonne position pour A[j],
auquel cas on insère la valeur de A[j].
TRI-INSERTION(A)
pour j ← 2 à longueur[A]
faire clé ← A[j]
i←j−1tant que i > 0 et A[i] > clé
faire A[i + 1] ← A[i]
i←i−1
A[i + 1] ← clé
Lélia Blin Université d’Evry17
INVARIANT DE BOUCLE TERMINAISON
Examinon se qui se passe à la terminaison de la boucle
Pour le tri par insertion:
la boucle pour extérieure prend fin quand j dépasse n,
c’est-à-dire quand j = n+1.
En substituant n+1 à j dans la formulation de l’invariant de boucle,
l’on a que le sous-tableau A[1..n] se compose
des éléments qui appartenaient originellement à A[1..n]
mais qui ont été triés depuis lors.
Or, le sous-tableau A[1 . . n] n’est autre que le tableau complet !
Par conséquent, le tableau tout entier est trié.
Donc l’algorithme est correct.
TRI-INSERTION(A)
pour j ← 2 à longueur[A]
faire clé ← A[j]
i←j−1tant que i > 0 et A[i] > clé
faire A[i + 1] ← A[i]
i←i−1
A[i + 1] ← clé
Lélia Blin Université d’Evry18
TRI PAR INSERTION : COMPLEXITÉ
Lélia Blin Université d’Evry
n − 1!nj=2 tj!n
!j=2!nj=2(tj − 1)
!n
!j=2!nj=2(tj − 1)
!n
TRI-INSERTION(A) cout fois
pour j ← 2 à longueur[A] c n
faire clé ← A[j] c n-1
i←j−1 c n-1
tant que i > 0 et A[i] > clé c
faire A[i + 1] ← A[i] c
i←i−1 c
A[i + 1] ← clé c n-1
19
TRI PAR INSERTION : COMPLEXITÉ
Lélia Blin Université d’Evry
T (n) = c1n+ c2(n� 1) + c3(n� 1) + c4
nX
j=2
tj + c5
nX
j=2
(tj � 1) + c6
nX
j=2
(tj � 1) + c7(n� 1)
T (n) = (c1 + c2 + c3 + c7)n+ (c4 + c5 + c6)n2
T (n) = O(n2)
20
TRI PAR SÉLECTION
Lélia Blin Université d’Evry21
TRI PAR SÉLECTION
Principe général :
Tableau toujours divisé en 2 parties
A chaque étape,
Choisir le plus petit élément de la partie non triée
Mettre cet élément à la fin de la partie triée
1 2 3 4 5 ... ... ... ... ... TailleMAX
Eléments triés Eléments non triés
Taille Courante
1 2 3 4 5 ... ... ... ... ... TailleMAX
Eléments triés
Eléments non triés
Taille CouranteLélia Blin Université d’Evry22
TRI PAR SÉLECTION: PSEUDO-CODE
TriParSelection(T : Tableau d’entiers, TailleMax : entier) !Entrées : T(tableau d’entiers), TailleMax (taille du tableau)!Sortie : Tableau trié T!Début! TC, p, min,temp : entier;!! Pour TC de 1 jqa TailleMax -1 faire!! ! min ← T[TC];!! ! p ← TC;!! ! Pour i de TC+1 jqa TailleMax faire!! ! ! Si T[i]< min alors!! ! ! ! min ← T[i];!! ! ! ! p ← i;!! ! ! Fin Si!! ! Fin Pour!! ! temp ← T[p];!! ! T[p] ← T[TC];!! ! T[TC] ← temp;!! Fin Pour!Fin
Lélia Blin Université d’Evry23
TRI PAR SÉLECTION : EXEMPLE
Début! TC, p, min,temp : entier;!! Pour TC de 1 jqa TailleMax -1 faire!! ! min ← T[TC];!! ! p ← TC;!! ! Pour i de TC+1 jqa TailleMax faire!! ! ! Si T[i]< min alors!! ! ! ! min ← T[i];!! ! ! ! p ← i;!! ! ! Fin Si!! ! Fin Pour!! ! temp ← T[p];!! ! T[p] ← T[TC];!! ! T[TC] ← temp;!! Fin Pour!Fin
TC=1
‣ min ← T[1]=9;!
‣ p ← TC=1;!
‣ i=2: T[2]<9: min← T[2]=4;p ← TC=2;!
‣ i=3: T[3]<4: min← T[3]=3;p ← TC=3;!
‣ i=4: T[4]<3!‣ i=5: T[5]<3!‣ i=6: T[6]<3: min← T[6]=2;p ← TC=6;!
‣ i=7: T[7]<2: min← T[7]=1;p ← TC=7;!
‣ temp ← T[p]=1;!
‣ T[7] ← T[1]=9;
‣ T[1] ← temp=1;
9 4 3 5 7 2 1
1 2 3 4 5 6 7
9 4 3 5 7 2 9
1 2 3 4 5 6 7
1 4 3 5 7 2 9
1 2 3 4 5 6 7
Lélia Blin Université d’Evry24
TRI PAR SÉLECTION : EXEMPLE
Début! TC, p, min,temp : entier;!! Pour TC de 1 jqa TailleMax -1 faire!! ! min ← T[TC];!! ! p ← TC;!! ! Pour i de TC+1 jqa TailleMax faire!! ! ! Si T[i]< min alors!! ! ! ! min ← T[i];!! ! ! ! p ← i;!! ! ! Fin Si!! ! Fin Pour!! ! temp ← T[p];!! ! T[p] ← T[TC];!! ! T[TC] ← temp;!! Fin Pour!Fin
TC=2
‣ min ← T[1]=4;!
‣ p ← TC=2;!
‣ i=3: T[3]<4: min← T[3]=3;p ← TC=3;!
‣ i=4: T[4]<3!‣ i=5: T[5]<3!‣ i=6: T[6]<3: min← T[6]=2;p ← TC=6;!
‣ i=7: T[7]<2!‣ temp ← T[p]=2;!
‣ T[6] ← T[2]=4;
‣ T[2] ← temp=2;
1 4 3 5 7 2 9
1 2 3 4 5 6 7
1 4 3 5 7 4 9
1 2 3 4 5 6 7
1 2 3 5 7 4 9
1 2 3 4 5 6 7
Lélia Blin Université d’Evry25
TRI PAR SÉLECTION : EXEMPLE
Début! TC, p, min,temp : entier;!! Pour TC de 1 jqa TailleMax -1 faire!! ! min ← T[TC];!! ! p ← TC;!! ! Pour i de TC+1 jqa TailleMax faire!! ! ! Si T[i]< min alors!! ! ! ! min ← T[i];!! ! ! ! p ← i;!! ! ! Fin Si!! ! Fin Pour!! ! temp ← T[p];!! ! T[p] ← T[TC];!! ! T[TC] ← temp;!! Fin Pour!Fin
TC=3
‣ min ← T[3]=3;!
‣ p ← TC=2;!
‣ i=4: T[4]<3!‣ i=5: T[5]<3!‣ i=6: T[6]<3!‣ i=7: T[7]<3!‣ temp ← T[p]=3;!
‣ T[4] ← T[3]=3;
‣ T[3] ← temp=3;
1 2 3 5 7 4 9
1 2 3 4 5 6 7
1 2 3 5 7 4 9
1 2 3 4 5 6 7
‣ min ← T[4]=5;!
‣ p ← TC=4;!
‣ i=5: T[5]<5!‣ i=6: T[6]<5: min← T[6]=4;p ← TC=6;!
‣ i=7: T[7]<4!‣ temp ← T[p]=4;!
‣ T[6] ← T[4]=5;
‣ T[4] ← temp=4;
TC=4 1 2 3 5 7 4 9
1 2 3 4 5 6 7
1 2 3 5 7 5 9
1 2 3 4 5 6 7
1 2 3 4 7 5 9
1 2 3 4 5 6 7
Lélia Blin Université d’Evry26
TRI PAR SÉLECTION : EXEMPLE
Début! TC, p, min,temp : entier;!! Pour TC de 1 jqa TailleMax -1 faire!! ! min ← T[TC];!! ! p ← TC;!! ! Pour i de TC+1 jqa TailleMax faire!! ! ! Si T[i]< min alors!! ! ! ! min ← T[i];!! ! ! ! p ← i;!! ! ! Fin Si!! ! Fin Pour!! ! temp ← T[p];!! ! T[p] ← T[TC];!! ! T[TC] ← temp;!! Fin Pour!Fin
TC=5
‣ min ← T[5]=7;!
‣ p ← TC=5;!
‣ i=6: T[6]<7: min← T[6]=5;p ← TC=6;!
‣ i=7: T[7]<5!‣ temp ← T[p]=5;!
‣ T[6] ← T[5]=7;
‣ T[3] ← temp=5;
‣ min ← T[6]=7;!
‣ p ← TC=6;!
‣ i=7: T[7]<7!‣ temp ← T[p]=7;!
‣ T[6] ← T[6]=7;
‣ T[7] ← temp=7;
TC=6
Lélia Blin Université d’Evry
1 2 3 4 7 5 9
1 2 3 4 5 6 7
1 2 3 4 7 7 9
1 2 3 4 5 6 7
1 2 3 4 5 7 9
1 2 3 4 5 6 7
1 2 3 4 5 7 9
1 2 3 4 5 6 7
1 2 3 4 5 7 9
1 2 3 4 5 6 7
27
TRI PAR SÉLECTION: COMPLEXITÉ
Complexité :
Nombre d’itérations : n-1
A chaque itération :
Recherche du minimum : n-TC
Mettre l’élément à sa place : 3
Au total : 3n + n(n-1)/2
Complexité : O(n2)
Lélia Blin Université d’Evry28
TRI PAR PERMUTATIONS
Lélia Blin Université d’Evry29
TRI PAR PERMUTATIONS (TRI À BULLES)
Idée Simple :
Si 2 éléments voisins ne sont pas ordonnés on les échange
Deux parties dans le tableau :
Les éléments de la partie triée sont inférieurs aux éléments de la partie non triée.
1 2 3 4 5 ... ... ... ... ... TailleMAX
Eléments triés < Eléments non triés
Taille CouranteLélia Blin Université d’Evry30
TRI PAR PERMUTATION
TriParPermutation(T : Tableau d’entiers, TailleMax : entier) !Entrées : T(tableau d’entiers), TailleMax (taille du tableau)!Sortie : Tableau trié T!Début! i: entier;! Pour TC de 2 jqa TailleMax faire!! !Pour i de TailleMax en décroissant jqa TC faire!! !! Si T[i-1]> T[i] alors!! !! ! T[i-1]↔ T[i];!
! !! Fin Si!! !Fin Pour!! Fin Pour!Fin
Lélia Blin Université d’Evry31
TRI PAR SÉLECTION : EXEMPLE
TC=2
‣ i=7: T[6]=2>T[7]=1: 2↔1!
‣ i=6: T[5]=7>T[6]=1: 7↔1!
‣ i=5: T[4]=5>T[5]=1: 5↔1!
‣ i=4: T[3]=3>T[4]=1: 3↔1!
‣ i=3: T[2]=4>T[3]=1: 4↔1!
‣ i=2: T[1]=9>T[2]=1: 9↔1
9 4 3 5 7 2 1
1 2 3 4 5 6 7
Lélia Blin Université d’Evry
Pour TC de 2 jqa TailleMax faire!
! Pour i de TailleMax en décroissant jqa TC !
faire!
! ! ! Si T[i-1]> T[i] alors!
! ! ! ! T[i-1]↔ T[i];!
! ! ! Fin Si!
! ! Fin Pour!
Fin Pour
9 4 3 5 7 1 2
1 2 3 4 5 6 7
9 4 3 5 1 7 2
1 2 3 4 5 6 7
9 4 3 1 5 7 2
1 2 3 4 5 6 7
9 4 1 3 5 7 2
1 2 3 4 5 6 7
9 1 4 3 5 7 2
1 2 3 4 5 6 7
1 9 4 3 5 7 2
1 2 3 4 5 6 7
32
TRI PAR SÉLECTION : EXEMPLE
TC=3
‣ i=7: T[6]=7>T[7]=2: 2↔7!
‣ i=6: T[5]=5>T[6]=2: 5↔2!
‣ i=5: T[4]=3>T[5]=2: 5↔2!
‣ i=4: T[3]=4>T[4]=2: 3↔2!
‣ i=3: T[2]=9>T[3]=2: 4↔2
Lélia Blin Université d’Evry
Pour TC de 2 jqa TailleMax faire!
! Pour i de TailleMax en décroissant jqa TC !
faire!
! ! ! Si T[i-1]> T[i] alors!
! ! ! ! T[i-1]↔ T[i];!
! ! ! Fin Si!
! ! Fin Pour!
Fin Pour
1 9 4 3 5 7 2
1 2 3 4 5 6 7
1 9 4 3 5 2 7
1 2 3 4 5 6 7
1 9 4 3 2 5 7
1 2 3 4 5 6 7
1 9 4 2 3 5 7
1 2 3 4 5 6 7
1 9 2 4 3 5 7
1 2 3 4 5 6 7
1 2 9 4 3 5 7
1 2 3 4 5 6 7
33
TRI PAR SÉLECTION : EXEMPLE
TC=4
‣ i=7: T[6]=5>T[7]=7:!
‣ i=6: T[5]=3>T[6]=5:!
‣ i=5: T[4]=4>T[5]=3: 4↔3!
‣ i=4: T[3]=9>T[4]=3: 9↔3
Lélia Blin Université d’Evry
Pour TC de 2 jqa TailleMax faire!
! Pour i de TailleMax en décroissant jqa TC !
faire!
! ! ! Si T[i-1]> T[i] alors!
! ! ! ! T[i-1]↔ T[i];!
! ! ! Fin Si!
! ! Fin Pour!
Fin Pour
1 2 9 4 3 5 7
1 2 3 4 5 6 7
1 2 9 3 4 5 7
1 2 3 4 5 6 7
1 2 3 9 4 5 7
1 2 3 4 5 6 7
TC=5
‣ i=7: T[6]=5>T[7]=7:!
‣ i=6: T[5]=4>T[6]=5:!
‣ i=5: T[4]=9>T[5]=4: 9↔4
1 2 3 9 4 5 7
1 2 3 4 5 6 7
1 2 3 9 4 5 7
1 2 3 4 5 6 7
34
TRI PAR SÉLECTION : EXEMPLE
TC=6
‣ i=7: T[6]=5>T[7]=7:!
‣ i=6: T[5]=9>T[6]=5: 9↔5
Lélia Blin Université d’Evry
Pour TC de 2 jqa TailleMax faire!
! Pour i de TailleMax en décroissant jqa TC !
faire!
! ! ! Si T[i-1]> T[i] alors!
! ! ! ! T[i-1]↔ T[i];!
! ! ! Fin Si!
! ! Fin Pour!
Fin Pour
TC=7
‣ i=7: T[6]=9>T[7]=7: 9↔7
1 2 3 4 9 5 7
1 2 3 4 5 6 7
1 2 3 4 5 9 7
1 2 3 4 5 6 7
1 2 3 4 5 9 7
1 2 3 4 5 6 7
1 2 3 4 5 7 9
1 2 3 4 5 6 7
35
TRI PAR PERMUTATION: COMPLEXITÉ
Complexité :
Boucle externe : n-2 fois
Boucle interne : TailleMax-TC fois
Total : (n-1)(n-2)/2
O(n2)
Lélia Blin Université d’Evry36
TRI PAR FUSION
Lélia Blin Université d’Evry37
TRI FUSION
Machine à trier des cartes perforées en 1938
1er algo de tri fusion écrit par Von Neumann pour l’EDVAC en 1945
Basé sur le paradigme « Diviser pour Régner »
http://fr.wikipedia.org/wiki/Carte_perforée
Lélia Blin Université d’Evry38
VON NEUMAN
Lélia Blin Université d’Evry
John von Neumann,
né János Neumann de Margitta en 1903 et mort en 1957
Mathématicien et physicien américano-hongrois.
Il a apporté d'importantes contributions:
mécanique quantique, analyse fonctionnelle, théorie des ensembles,
informatique, sciences économiques.
Il a de plus participé aux programmes militaires américains.
39
http://fr.wikipedia.org/wiki/John_von_Neumann
ARCHITECTURE DE VON NEUMAN
Lélia Blin Université d’Evry
Von Neumann a donné son nom à
l'architecture de von Neumann
utilisée dans la quasi totalité des ordinateurs modernes,
Il est, en 1945, le rapporteur des travaux pionniers en la matière (First Draft of a Report on the EDVAC).
Le modèle de calculateur à programme auquel son nom reste attaché et qu'il attribuait lui-même à Alan Turing, possède une unique mémoire qui sert à conserver les logiciels et les données.
Ce modèle, extrêmement innovant pour l'époque, est à la base de la conception de nombre d'ordinateurs.
40
http://fr.wikipedia.org/wiki/John_von_Neumann
TURING
Alan Mathison Turing, (23 juin 1912 - 7 juin 1954) Mathématicien britannique, Auteur de l'article fondateur de la science informatique: C’est le coup d'envoi à la création
des calculateurs universels programmables: les ordinateurs. Il y présente sa machine de Turing et les concepts modernes de programmation et de programme
Lélia Blin Université d’Evry41
TURING: PERE DE L’INFORMATIQUE
Il est également à l'origine: de la formalisation des concepts d'algorithme
et de calculabilité qui ont profondément marqué cette discipline.
Son modèle a contribué à établir définitivement
la thèse Church-Turing
qui donne une définition mathématique
au concept intuitif de fonction calculable.
Lélia Blin Université d’Evry42
TURING
Durant la Seconde Guerre mondiale: Il joue un rôle majeur dans les recherches sur les cryptographies générées par la machine Enigma utilisée par les nazis.
Après la guerre: il travaille sur un des tout premiers ordinateurs puis contribue au débat déjà houleux à cette période sur la capacité des machines à penser en établissant le test de Turing.
En 1952 un fait divers indirectement lié à son homosexualité lui vaut des poursuites judiciaires. Pour éviter la prison, il choisit la castration chimique par prise d'œstrogènes.
Il se suicide par empoisonnement au cyanure le 7 juin 1954.
Lélia Blin Université d’Evry43
PRIX TURING
Depuis 1966 le prix Turing est annuellement décerné par l'Association for Computing Machinery à des personnes ayant apporté une contribution scientifique significative à la science de l'informatique.
Cette récompense est souvent considérée comme l'équivalent du prix Nobel de l'informatique.
Lélia Blin Université d’Evry44
http://fr.wikipedia.org/wiki/Alan_Turing
TURING: RÉABILITATION
En 2009, une courte pétition: « Nous soussignés demandons au premier ministre de s'excuser
pour les poursuites engagées contre Alan Turing qui ont abouti à sa mort prématurée»,
dressée à l'initiative de l'informaticien John Graham-Cumming a été envoyée à Gordon Brown. En septembre 2009, le Premier ministre britannique a présenté des
regrets au nom du gouvernement britannique pour le traitement qui lui a été infligé
Lélia Blin Université d’Evry45
http://fr.wikipedia.org/wiki/Alan_Turing
DIVISER POUR RÉGNER
Séparer le pb en plusieurs sous-problèmes similaires au problème initial
3 étapes :
Diviser : le pb en un certain nombre de sous-pb
Régner : sur les sous-pbs en les résolvant
Combiner : les solutions des sous-pbs en une solution unique.
46Lélia Blin Université d’Evry
TRI FUSION
3 étapes :
Diviser :
la séquence de n éléments à trier en 2 sous-séquences de n/2 éléments.
Régner :
Trier les 2 sous-séquences récursivement à l’aide du tri fusion
Combiner :
Fusionner les 2 sous-séquences triées pour produire la séquence triée.
Toute séquence de longueur 1 est triée
Action Principale : la fusion
47Lélia Blin Université d’Evry
TRI FUSION
TriFusion(T : Tableau d’entiers,p: entier, r:entier) !Entrées : T(tableau d’entiers), p et r (indices du tableau tels que p ≤ r)!
Sortie : Tableau trié T entre les indices p et r!Début!! Si p < r!! !q ← ⎣(p+r)/2⎦!! !TriFusion(T,p,q)!! !TriFusion(T,q+1,r)!! !Fusion(T,p,q,r)!! Fin Si!Fin
48Lélia Blin Université d’Evry
LA FUSION
Fusion(T : Tableau d’entiers,p: entier, q: entier, r:entier) !Entrées : T(tableau d’entiers), p,q et r (indices du tableau tels que p < q ≤
r)!Sortie : Tableau trié T entre les indices p et r!Pré-condition : T[p..q-1] et T[q..r] sont triés!Début! i,j,k : entier;!! B : tableau d’entiers!! i ← p; k ← p; j ← q;!! Tant que (i < q et j ≤ r) faire!! ! Si T[i]< T[j] alors!! ! ! B[k]← T[i];!! ! ! i ← i + 1;!! ! Sinon!! ! ! B[k]← T[j];!! ! ! j ← j + 1;!! ! Fin Si!! ! k ← k + 1;!!! Fin Tant Que
Tant que (i < q) faire B[k]← T[i]; i ← i + 1; k ← k + 1; Fin Tant Que Tant que (j ≤ r) faire B[k]← T[j]; j ← j + 1; k ← k + 1; Fin Tant Que T ← B Fin
49Lélia Blin Université d’Evry
TRI FUSION: EXEMPLE
50Lélia Blin Université d’Evry
5 8 2 6 4 1 31 2 3 4 5 6 7
78
TRI FUSION: EXEMPLE
51Lélia Blin Université d’Evry
5 8 2 6 4 1 31 2 3 4 5 6 7
78
51
82
23
64
45
16
37
78
TRI FUSION: EXEMPLE
52Lélia Blin Université d’Evry
5 8 2 6 4 1 31 2 3 4 5 6 7
78
51
82
23
64
45
16
37
78
51
82
23
64
15
46
37
78
TRI FUSION: EXEMPLE
53Lélia Blin Université d’Evry
5 8 2 6 4 1 31 2 3 4 5 6 7
78
51
82
23
64
45
16
37
78
51
82
23
64
15
46
37
78
21
52
63
84
15
36
47
78
TRI FUSION: EXEMPLE
54
5 8 2 6 4 1 31 2 3 4 5 6 7
78
51
82
23
64
45
16
37
78
51
82
23
64
15
46
37
78
21
52
63
84
15
36
47
78
1 2 3 4 5 6 71 2 3 4 5 6 7
88
Lélia Blin Université d’Evry
TRI FUSION: EXEMPLE
55Lélia Blin Université d’Evry
1 2 3 4 5 6 7 8
TF(A,1,1)
1
TF(A,2,2)
2
TF(A,3,3)
3
TF(A,4,4)
4
TF(A,5,5)
5
TF(A,6,6)
6
TF(A,7,7)
7
TF(A,8,8)
8
Fusion
1
(A,1,1,2)
2
Fusion
3
(A,3,3,4)
4
Fusion
5
(A,5,5,6)
6
Fusion
7
(A,7,7,8)
8
Fusion
1
(A,1,
2
3
3
4)
4
Fusion
5
(A,5,
6
6
7
8)
8
1 2 3 4 5 6 7 8
TRI FUSION : COMPLEXITÉ
La preuve est technique mais
Intuitivement il faut résoudre :
Tri(n) = 2 * Tri(n/2) + Θ(n)
Complexité finale : O(n log2 n)
56Lélia Blin Université d’Evry
TRI PAR RAPIDE
Lélia Blin Université d’Evry57
TRI RAPIDE
Proposé par Hoare en 1962
Diviser : T[p..r] est divisé en 2 sous-tableaux non vide T[p..q] et T[q+1..r] tel que :
Chaque élément de T[p..q] soit inférieur à chaque élément de T[q+1..r]
fonction Partitionner
!
Régner : 2 sous-tableaux triés grâce à la récursivité
fonction TriRapide
Combiner : 2 sous-tableaux triés sur place : Rien à faire
58Lélia Blin Université d’Evry
TRI RAPIDE
59
140 7 • Tri rapide
Diviser : Le tableau A[p . . r] est partitionné (réarrangé) en deux sous-tableaux(éventuellement vides) A[p . . q − 1] et A[q + 1 . . r] tels que chaque élément deA[p . . q − 1] soit inférieur ou égal à A[q] qui, lui-même, est inférieur ou égalà chaque élément de A[q + 1 . . r]. L’indice q est calculé dans le cadre de cetteprocédure de partitionnement.
Régner : Les deux sous-tableaux A[p . . q−1] et A[q+1 . . r] sont triés par des appelsrécursifs au tri rapide.
Combiner : Comme les sous-tableaux sont triés sur place, aucun travail n’est néces-saire pour les recombiner : le tableau A[p . . r] tout entier est maintenant trié.
La procédure suivante implémente le tri rapide.
TRI-RAPIDE(A, p, r)1 si p < r2 alors q ← PARTITION(A, p, r)3 TRI-RAPIDE(A, p, q − 1)4 TRI-RAPIDE(A, q + 1, r)
Pour trier un tableau A entier, l’appel initial est TRI-RAPIDE(A, 1, longueur[A]).
a) Partitionner le tableau
Le point principal de l’algorithme est la procédure PARTITION, qui réarrange le sous-tableau A[p . . r] sur place.
PARTITION(A, p, r)1 x ← A[r]2 i ← p − 13 pour j ← p à r − 14 faire si A[j] ! x5 alors i ← i + 16 permuter A[i] ↔ A[j]7 permuter A[i + 1] ↔ A[r]8 retourner i + 1
La figure 7.1 montre le fonctionnement de PARTITION sur un tableau à 8éléments. PARTITION sélectionne toujours un élément x = A[r] comme élé-ment pivot autour duquel se fera le partitionnement du sous-tableau A[p . . r].La procédure continue et le tableau est partitionné en quatre régions (éven-tuellement vides). Au début de chaque itération de la boucle pour des lignes3–6, chaque région satisfait à certaines propriétés qui définissent un invariantde boucle : Au début de chaque itération de la boucle des lignes 3–6, pour toutindice k,
1) Si p ! k ! i, alors A[k] ! x.
PARTITION(A,p,q)!x ← A[p]!i ← p!j ← q!While i≠j!
if A[j]<x!if A[i]>x ! A[i] ↔ A[j];j--;i++!
else: i++!else: j--!
A[p] ↔ A[j]!return i
TRI RAPIDE: EXEMPLE
60Lélia Blin Université d’Evry
5 8 2 6 4 1 31 2 3 4 5 6 7
78
Pivot
5 8 2 6 4 1 31 2 3 4 5 6 7
78
Espace de travail
en partant de gauche le 1er élément aussi
grand que le pivot5 8 2 6 4 1 31 2 3 4 5 6 7
78
en partant de droite le 1er élément plus
petit que le pivot 5 8 2 6 4 1 31 2 3 4 5 6 7
78
échanger les éléments 5 3 2 6 4 1 81 2 3 4 5 6 7
78
Partition(Tab,1,7)
TRI RAPIDE: EXEMPLE
61Lélia Blin Université d’Evry
5 3 2 6 4 1 81 2 3 4 5 6 7
78
5 3 2 6 4 1 81 2 3 4 5 6 7
78
5 3 2 1 4 6 81 2 3 4 5 6 7
78
5 3 2 1 4 6 81 2 3 4 5 6 7
78
4 3 2 1 5 6 81 2 3 4 5 6 7
78
TRI RAPIDE: EXEMPLE
62Lélia Blin Université d’Evry
4 3 2 11 2 3 4
5 6 85 6 7
78
4 3 2 11 2 3 4
5 6 85 6 7
78
1 3 2 41 2 3 4
1 3 2 41 2 3 4
1 3 2 41 2 3 4
1 2 3 41 2 3 4
1 2 3 41 2 3 4
5 6 85 6 7
78
5 6 85 6 7
78
5 6 75 6 7
88
5 6 75 6 7
88
1 2 3 41 2 3 4
5 6 75 6 7
88
TRI RAPIDE
63Lélia Blin Université d’Evry
Partition(Tab,1,TailleMax)
Partition(Tab,1,q-1) Partition(Tab,q,TailleMax)
Partition(Tab,1,q'-1) Partition(Tab,q'',TailleMax)Partition(Tab,q',q-1) Partition(Tab,q,q''-1)
Partition(Tab,1,1) Partition(Tab,2,21) Partition(Tab,TailleMax,TailleMax)
TRI RAPIDE : COMPLEXITÉ
Temps d’exécution dépend de l’équilibre ou non du partitionnement.
Si le partitionnement est équilibré : aussi rapide que le tri fusion
Si le partitionnement est déséquilibré : aussi lent que le tri par insertion
64Lélia Blin Université d’Evry
PARTITIONNEMENT DANS LE PIRE CAS
2 sous-tableaux de : 1 élément n-1 éléments
Supposons que ce partitionnement intervienne à chaque étape. Le partitionnement coûte Θ(n) La récurrence :
T(n) = T(n-1) + Θ(n) T(1) = Θ(1)
65Lélia Blin Université d’Evry
PARTITIONNEMENT DANS LE PIRE CAS
T(n) = Σ O(k)
= O(Σ k)
= O(n2)
Ce partitionnement apparaît quand le tableau est trié !!!!
Pire dans ce cas là le tri par insertion est linéaire !!
66Lélia Blin Université d’Evry
PARTITIONNEMENT DANS LE MEILLEUR CAS
Partitionnement est équilibré.
Il faut donc résoudre :
T(n) = 2T(n/2) + Ω(n)
Solution : T(n) = Ω(n log2 n)
67Lélia Blin Université d’Evry
TRIS PAR COMPARAISONS
tous les tris vu dans ce cours sont tris par comparaisons
un tri par comparaison est un tri dans lequel on compare une paire d’éléments.
contrairement par exemple au tri dénombrement qui est un tri linéaire
68Lélia Blin Université d’Evry
Exemple le tri par dénombrement
soit A un tableau d’entier inférieur ou égal à 6
!
soit C un tableau auxiliaire qui compte le nombre de fois qu’apparaît un entier
!
!
soit B le tableau trié
TRI LINÉAIRE
3 6 4 1 3 4 1 4
0 0 0 0 0 0
1 2 3 4 5 6
1 111 2 22 3
1 1 3 3 4 4 4 6
69Lélia Blin Université d’Evry
OPTIMALITÉ DES TRIS VUS EN COURS
La borne inférieure pour un tri par comparaison est:
Ω(n log2 n)
Donc seul les tris qui ont une complexité en
O(n log2 n) sont optimaux.
Le tri fusion est optimal mais pas la version du tri rapide présenté dans ce cours!
70Lélia Blin Université d’Evry
RÉCAPITULATIF
AlgorithmePire
des cas
O
Meilleur des cas Ω
Principe
Insertion O(n Ω(n)Prendre un élément non encore trié L’insérer à sa place dans l’ensemble
des éléments triés
Sélection O(nChoisir le plus petit élément de la
partie non triée Mettre cet élément à la fin de la
partie triée
Tri Bulle O(n Si 2 éléments voisins ne sont pas ordonnés on les échange
Tri Fusion O(nlog(n)) récursif
Tri Rapide O(n²) Ω(nlog(n)) récursif avec pivot sur place
71Lélia Blin Université d’Evry
EXPÉRIMENTATIONS: COMPARAISONS POUR 10 VALEURS
Le tableau est croissant Le tableau est décroissantLe tableau est aléatoire
72Lélia Blin Université d’Evry
BIBLIOGRAPHIE
Certaine partie de ce cours sont tiré du livre Introduction à l’Algorithmique
Lélia Blin Université d’Evry73
Lélia Blin Université d’Evry