• Aucun résultat trouvé

INF220 Algorithme de tri

N/A
N/A
Protected

Academic year: 2022

Partager "INF220 Algorithme de tri"

Copied!
29
0
0

Texte intégral

(1)

INF220 Algorithme de tri

Jean-François Berdjugin IUT1, Département SRC,

Grenoble

(2)

Tri

• Nous passons notre vie à organiser, trier des données par ordre de mérite, par ordre alphabétique, par distance (Z-sorting), …

• Un ordinateur si il calcul mal, trie bien.

• Un algorithme juste est-il performant, suivant quels

critères (mémoire, temps d’éxecution, accès disques, …)

?

• Un problème important qui à donné naissance aux méthodes formelle (C.A.R.Hoare)

(3)

Tri

• Algorithme

séquentiel – parallèle

• Algorithme

itératifs – Récursifs

• Tri :

Interne – externe

• Performance en temps (fonction des données)

– Meilleur cas

– Plus mauvais cas

(4)

Temps d’éxecution

• Temps d’exécution en log2n, n, n log2n, n2

=>

N=15 min = 900 s = 900 000 ms Log2900 000 =19 ms

n log2900 000 =17 801 609 ms = 17 801 s = 296 s = 5 min

900 000 2 = 8,1 1011ms

= 9 jours

=> Ça vaut le coup d’étudier des algorithme de tri.

0 2000 4000 6000 8000 10000 12000

0 20 40 60 80 100 120

log(n,2) n n log(n,2) n2

(5)

Trier

• Trier c’est ordonner suivant une relation d’ordre (relation binaire, réflexive,

antisymétrique, transitive)

• Exemples : ≤, ordre alphabétique, grade,

(6)

Algorithme lents

Les algorithmes que nous allons étudier sont dit lents, leur plus mauvais cas d’exécution a une complexité asymptotique en O(n2).

Pour aller plus vite (O(n ln n)), il nous faut

• soit des arbres et la récurrence,

• soit des tris externes

• soit du parallélisme

(7)

Tri par insertion

• Idée : on prend les éléments les uns après les autres et on les insère parmi les

éléments déjà triés

=>

Une boucle pour parcourir le tableau

Une boucle pour insérer à la bonne place

(8)

Tri par insertion

public static void triInsertion(int tableau[]) {

int i,j, m;

int l = tableau.length -1;

for (i=1; i <= l; i++) {

m = tableau[i];

j=i;

while (j>0 && tableau[j-1]>m) {

tableau[j]=tableau[j-1];

j=j-1;

}

tableau[j]=m;

} }

(9)

Tri par insertion

10 8 12 6 8 0 11

(10)

Tri par insertion

10 8 12 6 8 0 11

8 10 12 6 8 0 11

8 10 12 6 8 0 11

6 8 10 12 8 0 11

6 8 8 10 12 0 11

0 6 8 8 10 12 11

0 6 8 8 10 11 12

(11)

Tri par sélection

• Idée : trouver le plus petit et le placer en premier puis trouver le plus petit parmi les éléments non placés et le placer en

second, etc.

=>

Une boucle de parcourt du tableau Une boucle pour trouver le min

(12)

Tri par sélection

public static void triSelection(int tableau[]) {

int i,j,m, min;

int l = tableau.length - 1;

for (i=0; i< l; i++) {

min = i;

for (j=i+1; j<=l; j++ ) {

if (tableau[j]< tableau[min]) min=j;

}

m=tableau[i];

tableau[i] = tableau[min];

tableau[min] = m;

} }

(13)

Tri par selection

10 8 12 6 8 0 11

(14)

Tri par selection

10 8 12 6 8 0 11

0 8 12 6 8 10 11

0 6 12 8 8 10 11

0 6 8 12 8 10 11

0 6 8 8 12 10 11

0 6 8 8 10 12 11

0 6 8 8 10 11 12

(15)

Tri a bulle

• Idée : permuter les éléments adjacents mal placés et parcourt autant de fois que nécessaire du tableau

=>

Une boucle pour sélectionner les éléments Une boucle pour les permutations

(16)

Tri à bulles

public static void triBulle(int tableau[]) {

int i,j,m;

int l = tableau.length -1;

for ( i=l; i>=0; i--)

for (j=1; j<=i; j++)

if (tableau[j-1] > tableau[j]) {

m = tableau[j-1];

tableau[j-1] = tableau[j];

tableau[j]=m;

} }

(17)

Tri à bulle

10 8 12 6 8 0 11

(18)

Tri à bulle

10 8 12 6 8 0 11

8 10 12 6 8 0 11

8 10 12 6 8 0 11

8 10 6 12 8 0 11

8 10 6 8 12 0 11

8 10 6 8 0 12 11

8 10 6 8 0 11 12

(19)

Tri à bulle

8 10 6 8 0 11 12

8 10 6 8 0 11 12

8 6 10 8 0 11 12

8 6 8 10 0 11 12

8 6 8 0 10 11 12

8 6 8 0 10 11 12

(20)

Tri à bulle

8 6 8 0 10 11 12

6 8 8 0 10 11 12

6 8 8 0 10 11 12

6 8 0 8 10 11 12

6 8 0 8 10 11 12

6 8 0 8 10 11 12

6 0 8 8 10 11 12

6 0 8 8 10 11 12

(21)

Tri à bulle

6 0 8 8 10 11 12

0 6 8 8 10 11 12

0 6 8 8 10 11 12

0 6 8 8 10 11 12

….

….

0 6 8 8 10 11 12

(22)

Comparaison

Complexité :

• Tri par insertion : en n² (double imbriquées)

• Tri par sélection : en n²

• Tri a bulle : en n²

Mais d’autres algorithme donc beaucoup reposent sur le principe de diviser pour régner existent :

• Tri par casier : en N, c’est un algorithme de tri externe

• Tri par tas (tri par comparaison) : en N Log N

• …

(23)

Tri par comparaison

• Principe comparer deux cases

• Si l’on doit trier n éléments alors ces n éléments peuvent former n! combinaisons.

• Si l’on utilise un arbre de résolution

(représentant l’ensemble des comparaisons) de hauteur h (chemin de la racine vers la feuille) alors le nombre maximal de feuille est de 2h On a donc n! ≤ 2h

(24)

Tri par comparaison

A ≤ B C ≤ B

B ≤ C A ≤ C A ≤ C A ≤ B

A C B A B C B C A B A C B C A B A C C A B C B A

(25)

Tri par comparaison

On a donc n! ≤ 2h (6 ≤ 8)

<=>

Log2(n!) ≤ log2(2h)

Or la limite de n log2n = log2 n!

h est la limite inférieure de n log2n

Il faudra au moins n log2n comparaison

Bref dans le pire des cas on ne pas dépasser un certain niveau de performance

Les algorithmes sont adaptés à des circonstances (des cas, des sous-problèmes).

(26)

Tri par casier

La plage des données est limitée :

• On créer un tableau temporaire (les

casiers) dont la taille est celle de la plage des données

• On range dans les casiers le nombre

d’occurrence des valeurs du tableau initial

• On parcours les casiers dans l’ordre pour créer le tableau trié.

(27)

Tri casier

public static void triCasier(int tableau[]){

int longueur=tableau.length;

int mini=tableau[0]; int maxi=tableau[0];

for(int i=1;i<longueur;i++){

if(mini>tableau[i]) {mini=tableau[i];}

if(maxi<tableau[i]) {maxi=tableau[i];}}

int tmpLong=maxi-mini+1; int tmpTableau[]=new int[tmpLong];

for(int i=0;i<tmpLong;i++){ tmpTableau[i]=0; }

for(int i=0;i<longueur;i++) {tmpTableau[tableau[i]-mini]++; }

int compt=0;

for(int i=0;i<tmpLong;i++) {

while(tmpTableau[i]>0) {

tableau[compt]=mini+i;

tmpTableau[i]--;

compt++;

}} }

(28)

Tri casier

4 3 10 4 3 2 tableau

mini : 2 maxi : 10

tmpLong: 9 1 2 2 0 0 0

0 1 2 3 4 5

0 0 1

7

6 8

2 3 4 5 6 7 8 9 10

2 3 3 4 4 10 tableau

casiers

(29)

La suite

Les objets : un moyen de lier les données (les variables d’instance) et les

mécanismes portant sur ces données (les méthodes).

Références

Documents relatifs

On a vu dans la structure du cristal de silicium qu’il était composé de tétraèdres d’atomes de silicium très liés et bien stables ; chaque atome de Si échange avec ses

• Le gain sera beaucoup plus faible quand dephasage est 180 degres. • On fait ca avec capacite

Les rectangles (D) et (F) n’ont pas des dimensions proportionnelles à celle de (A) mais les écarts ne sont pas trop grands de façon à ce qu’on ne puisse pas

a - Ecrire un programme pour afficher un d´ egrad´ e de couleur entre les couleurs rouge et verte : chaque point de coordonn´ ees (x, y) devra avoir une intensit´ e de couleur rouge

&#34;Possédant initialement un couple de lapins, combien de couples obtient-on en douze mois si chaque couple engendre tous les mois un nouveau couple à compter du second mois de

Il en résulte que les opérations d’effacement peuvent être réalisées dans n’importe quel ordre et qu’en fin de parcours c’est à dire au bout de n-1 minutes, c’est toujours

Un entier est dit « équilibré » si parmi deux chiffres consécutifs quelconques de sa représentation décimale l’un est pair et l’autre est impair. Par exemple 187830 est un

• Si ces deux cartes sont les plus petits châteaux, ils mettent chacun au-dessus de leur carte une carte, face cachée, puis une carte face découverte. Celui qui a mis