• 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

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

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

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

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