Les Algorithmes de tri
Plan du chapitre Introduction Rappel Le tri Shell Le tri par fusion Applications
I. Introduction Qu'est-ce qu'un tri ? Un tri est une procédure qui permet de classer ou ordonner une série d'éléments d'un type quelconque, selon un ordre croissant ou décroissant en utilisant un principe ou un algorithme formels donné. La série d’éléments est un tableau d’entiers par exemple. En informatique ou en mathématiques, un algorithme de tri est un algorithme qui permet d'organiser une collection d'objets selon un ordre déterminé. Les objets à trier font donc partie d'un ensemble muni d'une relation d'ordre (de manière générale un ordre total). Les ordres les plus utilisés sont l’ordre numérique et l'ordre lexicographique (dictionnaire). Suivant la relation d'ordre considérée, une même collection d’objet peut donner lieu à divers arrangements, pourtant il est possible de définir un algorithme de tri indépendamment de la fonction d’ordre utilisée. Celui-ci ne fera qu'utiliser une certaine fonction d’ordre correspondant à une relation d’ordre qui doit permettre de comparer tout couple d'éléments de la collection.
Complexité des algorithmes de tris La complexité des algorithmes de tris varie selon la méthode utilisée. Pour cela plusieurs algorithmes de tris existent qui n'ont pas tous la même complexité
Quel sont les particularités des tris Tris itératifs Tris récursifs
TRIS ITERATIFS Quelles sont les particularités des tris itératifs ? Dans un tri itératif, on procède de manière itérative ! C'est-à-dire que l'on trie le tableau d'un seul bloc, en le parcourant élément par élément, case par case. Il y a en fait deux principes différents : se déplacer de la première à la dernière case, en y plaçant à chaque fois l'élément qui doit y aller : c'est le tri par sélection et tri à bulle), inversement, prendre chaque élément dans l'ordre où il se présente, et le mettre à la bonne place : c'est le tri par insertion et tri Shell
II. Rappel Tri par sélection Tri à bulles Tri par insertion
3. Tri par insertion Principe Simulation Résolution de problèmes Complexité
Principe Le tri par insertion est le tri le plus efficace sur des listes de petite taille. C'est pourquoi il est utilisé par d'autres méthodes comme le tri rapide (ou quicksort). Il est d'autant plus rapide que les données sont déjà triées en partie dans le bon ordre. Le principe de ce tri est très simple: c'est le tri que toute personne utilise naturellement quand elle a des dossiers, des cartes (ou n'importe quoi d'autre) à classer. On prend un dossier et on le met à sa place parmi les dossiers déjà triés. Puis on recommence avec le dossier suivant.
Pour procéder à un tri par insertion, il suffit de suivre l’algorithme formel suivant: Parcourir une liste : on considère que les (i-1) premiers éléments de la liste sont triés et placer le ième élément à sa place parmi les (i-1) déjà triés. Répéter cette action jusqu’à atteindre la fin de la liste Pour insérer le ième élément à sa place utiliser une variable intermédiaire tmp pour conserver la valeur à insérer puis, Déplacer les éléments tab[i-1],tab[i-2],… vers la droite tant que leur valeur est supérieure à celle de tmp. Affecter alors à l’emplacement dans le tableau laissé libre par le décalageà droite la valeur de tmp. Remarques: On peut aussi faire une recherche par dichotomie sur les tableaux. Une amélioration possible de ce tri, sensible pour les listes de plus de 15 éléments, est le tri de Shell.
Simulation Fixe Dynamique
Soit le tableau non-trié à 6 composantes suivante: Simulation fixe Soit le tableau non-trié à 6 composantes suivante: 2 1 8 4 3 6 On procède à trier ce tableau par ordre croissant. Le sous-vecteur constitué du premier élément seul est évidemment trié! On peut donc considérer que notre problème se ramène à deux vecteurs, un trié de longueur 1 et un non trié de longueur 6-1. Etape1 On cherche la position d’insertion de l’élément d’indice 2 dans la 1ère partie du tableau dans l’ordre convenable puisque 2>1: on garde la valeur de l’élément en cours dans la variable tmp On décale à droite d’un pas la première case et mettre la valeur de tmp à la 1ère case: 2 1 8 4 3 6 Tmp 1 1 2 8 4 3 6
Etape2:On traite à présent la troisième composante de valeur 8 Etape2:On traite à présent la troisième composante de valeur 8. 8 est plus grand que 2 et ne doit donc pas bouger. La nouvelle situation est alors: Etape3:On cherche la position d’insertion du l’élément d’indice 4 dans la 1ère partie du tableau dans l’ordre convenable on garde la valeur de l’élément en cours dans la variable tmp On décale à droite d’un pas l’élément n°3,…jusqu’à avoir un élément inférieur à 4 Affecter à la dernière case décalée la valeur de tmp 1 2 8 4 3 6 Tmp 1 2 8 4 3 6 1 2 4 8 3 6 4
Etape4:On cherche la position d’insertion du l’élément d’indice 5 dans la 1ère partie du tableau dans l’ordre convenable on garde la valeur de l’élément en cours dans la variable tmp On décale à droite d’un pas l’élément n°4,…jusqu’à avoir un élément inférieur à 3 Affecter à la dernière case décalée la valeur de tmp Etape4:On cherche la position d’insertion de l’élément d’indice 5 dans la 1ère partie du tableau dans l’ordre convenable on garde la valeur de l’élément en cours dans la variable tmp Tmp 1 2 4 8 3 6 3 1 2 3 4 8 6 Tmp 1 2 3 4 8 6 1 2 4 3 6 8 6
Tri par insertion Résolution du problème Tri insertion Saisie(n) Remplir(n,T) Trier (n,T) Affiche(n,T) Procédure Procédure Procédure Procédure DECALER(T, Deb,fin) Procédure Décomposition modulaire
Tri par insertion Résolution du problème Analyse du programme Principal: Résultat: L’affichage du tableau trié est la tâche de la procédure afficher Traitement: Pour trier le tableau on appelle la procédure trier Le tableau est rempli grâce à la procédure remplir Le nombre des éléments à remplir est donné par la procédure saisir
Tri par insertion Résolution du problème Algo du Programme Principal 0) Début tri_ins 1)Saisie(n) 2)remplir(T,n) 3)Trier(T,n) 4)Affiche(T,n) 5)Fin tri_ins
Analyse de la procédure trier Résultat: T trié Traitement: D’après l’algorithme formel de cette méthode il s’agit d’un traitement répétitif complet de l’élément n°2 jusqu’au dernier élément du tableau: Pour I de 2 à n faire Pour chaque valeur du compteur et si l’élément correspondant n’est pas à sa place, nous réalisons les actions suivantes: Ranger la valeur de T[I] dans la variable Tmp Décaler vers la droite les valeurs de T[i-1],T[i-2],… jusqu’à arriver à une valeur qui est inférieure à T[c]. Cette action est réalisée par la procédure DECALER. Affecter au dernier élément décalé la valeur de Tmp Si T[i-1] > T[i] alors TmpT[i] DECALER (T,i-1,p) T[p+1]Tmp Finsi
Algorithme de la procédure trier 0) procedure trier(n:entier; var t:tab) Pour i de 2 à n faire Si T[i-1] > T[i] alors TmpT[i] DECALER (T,i-1,p) T[p+1]Tmp Finsi Finpour Fin trier
Spécification de la procédure décaler Algorithme Résultat:décaler à droite les éléments du tableau T d’indice deb à l’indice fin Traitement: Il s’agit d’un traitement répétitif à condition d’arrêt: Tant que (fin>=1) et (T[fin]>tmp) faire initialisation:findeb Action de décalage: T[fin+1]T[fin] Décrémentation de la variable fin par 1:finfin-1 0) procedure DECALER(var t:tab;deb:entier; varfin: entier) Fin deb T[fin+1]T[fin] finfin-1 Fin tantque 2) Fin DECALER
Complexité Comme nous l'avons vu ci-dessus, le tri par insertion linéaire est, en moyenne, essentiellement d'ordre n2. (puisque il utilise 2 boucles imbriquées d’ordre n). Il est toutefois évident que si le vecteur est déjà presque trié dans le bon ordre, le nombre d'opérations sera beaucoup plus réduit. Il suffit pour s'en convaincre de réfléchir au tri par insertion linéaire d'un vecteur déjà complètement trié: pour chaque élément, une seule comparaison sera nécessaire pour déterminer à quelle place il doit se mettre. Dans ces conditions, on n'a à effectuer que environ n opérations. Ces considérations ont amené à envisager des méthodes de tri qui permettent de déplacer les éléments à trier de plus d'une case à la fois obtenant ainsi un tri préliminaire rapide qui regroupe en tête du vecteur les petits éléments, et en fin de vecteur, les grandes valeurs. Ce pré-tri permet alors d'accélérer sensiblement la suite des opérations c’est le tri Shell
Tri SHELL Imaginé par D. L. Shell (1959) Ce tri est une accélération du tri par insertion. Dans le tri par insertion, un élément va à sa place en progressant lentement, case par case. L'accélération consiste à le faire aller à sa place en commençant par faire des grands pas, puis des pas de plus en plus petits, jusqu'à, évidemment, des pas de 1 pour que le tableau soit trié.
Principe Tri SHELL L'étape de base de l'algorithme considère le tableau initial constitué de P sous-tableaux, dont les éléments sont distants de P cases. ces P tableaux sont triés par l'algorithme de tri par insertion. On dit alors que le tableau initial est P-trié. On répète cette opération de base pour des valeurs de P qui vont en diminuant jusqu'à une valeur finale 1. La qualité du tri Shell va dépendre de la suite des valeurs de P. Une "bonne" suite est donnée par : P1=1 Pk+1=3*Pk+1
Tri SHELL … Exemple On se propose d’utiliser la méthode de tri Shell pour trier un tableau T en ordre croissant. Considérons le tableau T contenant les 5 éléments suivants: 11 5 20 10 13 T= 4 3 2 1
Tri SHELL … Exemple Étape 0: Calculer P le plus grand décalage possible en utilisant l’instruction suivante: Tant que P≤N faire P3*P+1 Fin Tantque Donc P vaut 13 11 5 20 10 13 T= 4 3 2 1
Tri SHELL … Exemple Étape 1: Tant que P>1 c’est-à-dire tant que le décalage possible on calcule P en utilisant la formule suivante:P(P-1)div 3 On obtient P=4 Donc on fait le décalage avec pas de 4 11 5 20 10 13 T= 4 3 2 1
Tri SHELL … Exemple Étape 1…: Puisque P=4 On fait le parcours du tableau de la case n°5 (P+1) à la dernière case en utilisant la méthode de tri par insertion mais avec un décalage de pas de 4. On obtient le tableau suivant: 13 5 20 10 11 T= 4 3 2 1
Tri SHELL … Exemple Étape 2: Après que le décalage se termine et puisque P=4>1. on recalcule de nouveau P et on trouve P= (P-1) div 3=1 On fait le parcours du tableau de la case n°2 (P+1) à la dernière case en utilisant la méthode de tri par insertion avec un décalage de pas de 1. On obtient le tableau suivant: 20 13 11 10 5 T= 4 3 2 1
0) Procedure Trier( n:integer;var T;tab) 1) P1 2) Tant que P≤n faire Algorithme de la procédure Trier 0) Procedure Trier( n:integer;var T;tab) 1) P1 2) Tant que P≤n faire PP*3+1 Fin Tantque 3) Tant que P>1 faire PP Div 3 Pour j de P+1 à n faire auxT[j] kj Tant que (k>P) et (T[K-P]>aux) faire T[k]T[k-P] Kk-P Fin tant Que T[k]aux Fin Pour 4) Fin Trier décalage des valeurs avec un pas de p calcul du plus grand décalage possible tant que le décalage possible est non nul Insertion de l’élément à sa place valeur à décaler (éventuellement)