LES ALGORITHMES DE TRIS
Chargée de cours: Lélia Blin
Transparents:http://www-npa.lip6.fr/~blin/Enseignements.html
Email: lelia.blin@lip6.fr
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’Evry
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
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
TRI PAR INSERTION
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 quea′1!a′2 !· · ·!a′n.
Les nombres à trier sont parfois appelésclés.
Dans cet ouvrage, nous exprimerons généralement les algorithmes sous la forme de programmes écrits en un pseudo code qui, à certains égards, rappelle C, Pascal ou 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 claire et 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 pseudo code 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 de l’algorithme.
Nous commencerons par letri par insertion, qui 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. Au début, la main gauche du joueur est vide et ses cartes sont posées sur la table. Il prend alors sur la table les cartes, une par une, pour les placer dans sa main gauche. 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, comme le montre la figure 2.1. 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.
2♣
♣
♣
♣ 24♣
♣ ♣
♣♣
♣ 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 tableauA[1. .n] qui
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 quea′1 !a′2 !· · ·!a′n.
Les nombres à trier sont parfois appelésclés.
Dans cet ouvrage, nous exprimerons généralement les algorithmes sous la forme de programmes écrits en un pseudo code qui, à certains égards, rappelle C, Pascal ou 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 claire et 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 pseudo code 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 de l’algorithme.
Nous commencerons par letri par insertion, qui 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. Au début, la main gauche du joueur est vide et ses cartes sont posées sur la table. Il prend alors sur la table les cartes, une par une, pour les placer dans sa main gauche. 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, comme le montre la figure 2.1. 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.
2♣
♣
♣
♣ 24♣
♣ ♣
♣♣
♣ 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’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 quea′1 !a′2 !· · ·!a′n.
Les nombres à trier sont parfois appelésclés.
Dans cet ouvrage, nous exprimerons généralement les algorithmes sous la forme de programmes écrits en un pseudo code qui, à certains égards, rappelle C, Pascal ou 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 claire et 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 pseudo code 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 de l’algorithme.
Nous commencerons par letri par insertion, qui 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. Au début, la main gauche du joueur est vide et ses cartes sont posées sur la table. Il prend alors sur la table les cartes, une par une, pour les placer dans sa main gauche. 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, comme le montre la figure 2.1. 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.
2♣
♣
♣
♣ 24♣
♣ ♣
♣♣
♣ 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.
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 quea′1 !a′2 !· · ·!a′n.
Les nombres à trier sont parfois appelésclés.
Dans cet ouvrage, nous exprimerons généralement les algorithmes sous la forme de programmes écrits en un pseudo code qui, à certains égards, rappelle C, Pascal ou 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 claire et 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 pseudo code 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 de l’algorithme.
Nous commencerons par letri par insertion, qui 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. Au début, la main gauche du joueur est vide et ses cartes sont posées sur la table. Il prend alors sur la table les cartes, une par une, pour les placer dans sa main gauche. 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, comme le montre la figure 2.1. 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.
2♣
♣
♣
♣ 24♣
♣ ♣
♣♣
♣ 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’Evry
TRI PAR INSERTION: PRINCIPE
Prendre un élément non encore trié
L’insérer à sa place dans l’ensemble des éléments triés
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
TRI INSERTION PSEUDO CODE
Lélia Blin Université d’Evry
T
RI-I
NSERTION(A)
pour j ← 2 à longueur[A]
faire clé ← A[j]
i←j−1
tant que i > 0 et A[i] > clé
faire A[i + 1] ← A[i]
i←i−1
A[i + 1] ← clé
TRI-INSERTION(A)
pour j ← 2 à longueur[A]
faire clé ← A[j]
i←j−1
tant 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
Lélia Blin Université d’Evry
TRI-INSERTION(A)
pour j ← 2 à longueur[A]
faire clé ← A[j]
i←j−1
tant 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
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.
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’Evry
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.
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’Evry
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−1
tant que i > 0 et A[i] > clé
faire A[i + 1] ← A[i]
i←i−1 A[i + 1] ← clé
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−1
tant 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’Evry
TRI PAR INSERTION : COMPLEXITÉ
n − 1
! n
j=2 t j
! n
!
j=2!
nj=2
(t
j− 1)
!
n!
j=2!
nj=2
(t
j− 1)
!
nTRI-INSERTION(A)
cout fois
pour j ← 2 à longueur[A]
c
nfaire clé ← A[j]
c
n-1i←j−1
c
n-1tant 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-1TRI PAR INSERTION : COMPLEXITÉ
Lélia Blin Université d’Evry
T (n) = c
1n + c
2(n 1) + c
3(n 1) + c
4X
nj=2
t
j+ c
5X
nj=2
(t
j1) + c
6X
nj=2
(t
j1) + c
7(n 1) T (n) = (c
1+ c
2+ c
3+ c
7)n + (c
4+ c
5+ c
6)n
2T (n) = O(n
2)
TRI PAR SÉLECTION
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 Courante
Lélia Blin Université d’Evry
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
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’Evry
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
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’Evry
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
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
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(n 2 )
Lélia Blin Université d’Evry
TRI PAR PERMUTATIONS
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
Lélia Blin Université d’Evry
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
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
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 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
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
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 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
TRI PAR PERMUTATION:
COMPLEXITÉ
Complexité :
Boucle externe : n-2 fois
Boucle interne : TailleMax-TC fois Total : (n-1)(n-2)/2
O(n 2 )
Lélia Blin Université d’Evry
TRI PAR FUSION
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’Evry
VON NEUMAN
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.
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.
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
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’Evry
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.
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’Evry
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é
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.
Lé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
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
Lé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
TRI FUSION:
EXEMPLE
Lélia Blin Université d’Evry
5 8 2 6 4 1 3
1 2 3 4 5 6 7
7
8
TRI FUSION:
EXEMPLE
5 8 2 6 4 1 3
1 2 3 4 5 6 7
7
8
5
1
8
2
2
3
6
4
4
5
1
6
3
7
7
8
TRI FUSION:
EXEMPLE
Lélia Blin Université d’Evry
5 8 2 6 4 1 3
1 2 3 4 5 6 7
7
8
5
1
8
2
2
3
6
4
4
5
1
6
3
7
7
8
5
1
8
2
2
3
6
4
1
5
4
6
3
7
7
8
TRI FUSION:
EXEMPLE
5 8 2 6 4 1 3
1 2 3 4 5 6 7
7
8
5
1
8
2
2
3
6
4
4
5
1
6
3
7
7
8
5
1
8
2
2
3
6
4
1
5
4
6
3
7
7
8
2
1
5
2
6
3
8
4
1
5
3
6
4
7
7
8
TRI FUSION:
EXEMPLE
5 8 2 6 4 1 3
1 2 3 4 5 6 7
7
8
5
1
8
2
2
3
6
4
4
5
1
6
3
7
7
8
5
1
8
2
2
3
6
4
1
5
4
6
3
7
7
8
2
1
5
2
6
3
8
4
1
5
3
6
4
7
7
8
1 2 3 4 5 6 7
1 2 3 4 5 6 7
8
8
Lélia Blin Université d’Evry
TRI FUSION:
EXEMPLE
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 log 2 n)
Lélia Blin Université d’Evry
TRI PAR RAPIDE
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
Lé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 de A[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 cette procédure de partitionnement.
Régner : Les deux sous-tableaux A[p . . q − 1] et A[q +1 . . r] sont triés par des appels ré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.
T RI -R APIDE (A, p, r) 1 si p < r
2 alors q ← P ARTITION (A, p, r) 3 T RI -R APIDE (A, p, q − 1) 4 T RI -R APIDE (A, q + 1, r)
Pour trier un tableau A entier, l’appel initial est T RI -R APIDE (A, 1, longueur[A]).
a) Partitionner le tableau
Le point principal de l’algorithme est la procédure P ARTITION , qui réarrange le sous- tableau A[p . . r] sur place.
P ARTITION (A, p, r) 1 x ← A[r]
2 i ← p − 1
3 pour j ← p à r − 1 4 faire si A[j] ! x
5 alors i ← i + 1
6 permuter A[i] ↔ A[j]
7 permuter A[i + 1] ↔ A[r]
8 retourner i + 1
La figure 7.1 montre le fonctionnement de P ARTITION sur un tableau à 8 éléments. P ARTITION 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 lignes 3–6, chaque région satisfait à certaines propriétés qui définissent un invariant de boucle : Au début de chaque itération de la boucle des lignes 3–6, pour tout
P ARTITION (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
Lélia Blin Université d’Evry
5 8 2 6 4 1 3
1 2 3 4 5 6 7
7
8 Pivot
5 8 2 6 4 1 3
1 2 3 4 5 6 7
7
8 Espace de travail
en partant de gauche le 1er élément aussi
grand que le pivot
5 8 2 6 4 1 3
1 2 3 4 5 6 7
7
8
en partant de droite le 1er élément plus
petit que le pivot
5 8 2 6 4 1 3
1 2 3 4 5 6 7
7
8
échanger les éléments
5 3 2 6 4 1 8
1 2 3 4 5 6 7
7
8
Partition(Tab,1,7)
TRI RAPIDE: EXEMPLE
5 3 2 6 4 1 8
1 2 3 4 5 6 7
7
8
5 3 2 6 4 1 8
1 2 3 4 5 6 7
7
8
5 3 2 1 4 6 8
1 2 3 4 5 6 7
7
8
5 3 2 1 4 6 8
1 2 3 4 5 6 7
7
8
4 3 2 1 5 6 8
1 2 3 4 5 6 7
7
8