• Aucun résultat trouvé

Chargée de cours: Lélia Blin

N/A
N/A
Protected

Academic year: 2022

Partager "Chargée de cours: Lélia Blin "

Copied!
73
0
0

Texte intégral

(1)

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

(2)

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

(3)

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

(4)

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

(5)

TRI PAR INSERTION

14 2Premiers pas

Sortie : permutation (réorganisation) ⟨a1,a2, . . . ,an⟩ de la suite donnée en entrée, de façon quea1!a2 !· · ·!an.

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

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 tableauA[1. .n] qui

(6)

14 2Premiers pas

Sortie : permutation (réorganisation) ⟨a1,a2, . . . ,an⟩ de la suite donnée en entrée, de façon quea1 !a2 !· · ·!an.

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

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’Evry

(7)

14 2Premiers pas

Sortie : permutation (réorganisation) ⟨a1,a2, . . . ,an⟩ de la suite donnée en entrée, de façon quea1 !a2 !· · ·!an.

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

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.

(8)

14 2Premiers pas

Sortie : permutation (réorganisation) ⟨a1,a2, . . . ,an⟩ de la suite donnée en entrée, de façon quea1 !a2 !· · ·!an.

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

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’Evry

(9)

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

(10)

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é

(11)

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

(12)

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

(13)

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.

(14)

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

(15)

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.

(16)

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

(17)

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é

(18)

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

(19)

TRI PAR INSERTION : COMPLEXITÉ

n − 1

! n

j=2 t j

! n

!

j=2

!

n

j=2

(t

j

− 1)

!

n

!

j=2

!

n

j=2

(t

j

− 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

(20)

TRI PAR INSERTION : COMPLEXITÉ

Lélia Blin Université d’Evry

T (n) = c

1

n + c

2

(n 1) + c

3

(n 1) + c

4

X

n

j=2

t

j

+ c

5

X

n

j=2

(t

j

1) + c

6

X

n

j=2

(t

j

1) + c

7

(n 1) T (n) = (c

1

+ c

2

+ c

3

+ c

7

)n + (c

4

+ c

5

+ c

6

)n

2

T (n) = O(n

2

)

(21)

TRI PAR SÉLECTION

(22)

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

(23)

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

(24)

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

(25)

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

(26)

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

(27)

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

(28)

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

(29)

TRI PAR PERMUTATIONS

(30)

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

(31)

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

(32)

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

(33)

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

(34)

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

(35)

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

(36)

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

(37)

TRI PAR FUSION

(38)

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

(39)

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

(40)

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

(41)

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

(42)

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

(43)

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.

(44)

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

(45)

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

(46)

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

(47)

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

(48)

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

(49)

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

(50)

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

(51)

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

(52)

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

(53)

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

(54)

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

(55)

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

(56)

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

(57)

TRI PAR RAPIDE

(58)

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

(59)

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 xA[r]

2 ip − 1

3 pour jp à r − 1 4 faire si A[j] ! x

5 alors ii + 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

(60)

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)

(61)

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

Références

Documents relatifs

Illustrer avec des images découpées, le texte de l'histoire utilisant un vocabulaire spatial Associer chaque image au texte correspondant à la direction surveillée. e place les

[r]

Cette vaste enquête sur la capitale, dans la lignée de l’École de Chicago, cartographie les trajets quotidiens d’habitants, pour montrer que selon leur tra- vail (leur place dans

- À chaque fois, un joueur par équipe tente de faire deviner à ses coéquipiers le plus possible de cartes pendant un temps donné (à adapter selon le niveau et

[r]

Toutes les cartes utilisées (verbe et sujet) sont alors défaussées et les joueurs piochent une nouvelle carte « verbe », tandis qu’une nouvelle carte « sujet »est posée sur

Entoure en rouge les animaux qui se dirigent vers

D’autres choix sont bien entendu possibles pour les constantes ; l’important est qu’il existe au moins une possibilité.. Dans chaque partie, la valeur de n 0 est la valeur mi-