INAL 3 Les tris -  · IDÉE FONDAMENTALE Une collection de valeurs de même type (rangées dans un...

Post on 16-Oct-2019

2 views 0 download

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: lelia.blin@lip6.fr

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