plan du chapitre i. introduction ii. rappel iii. le tri shell iv. le tri par fusion v. applications
TRANSCRIPT
Plan du chapitre
I. Introduction
II. Rappel
III. Le tri Shell
IV. Le tri par fusion
V. 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ératifsTris 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
1. Tri par sélection
2. Tri à bulles
3. 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
Simulation fixe
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.Etape1On cherche la position d’insertion de l’élément d’indice 2 dans la 1ère partie du tableau dans l’ordre convenablepuisque 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 1
Tmp
1 2 8 4 3 6
Soit le tableau non-trié à 6 composantes suivante:
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 convenableon 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
1 2 8 4 3 6 4
Tmp
1 2 4 8 3 6
Etape4:On cherche la position d’insertion du l’élément d’indice 5 dans la 1ère partie du tableau dans l’ordre convenableon 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 convenableon 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
1 2 4 8 3 6
Tmp
31 2 3 4 8 6
1 2 3 4 8 6 6
Tmp
1 2 4 3 6 8
Tri par insertionRésolution du problème
Tri insertion
Saisie(n) Remplir(n,T) Affiche(n,T)Trier (n,T)
Procédure
Procédure
Procédure
Procédure
Décomposition modulaire
DECALER(T, Deb,fin)
Procédure
Tri par insertionRé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 insertionRésolution du problème
Algo du Programme Principal
0) Début tri_ins1)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)
1) 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
2) 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:findebAction 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)
1) Fin deb
Tant que (fin>=1) et (T[fin]>tmp) faire
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é.
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
Principe Tri SHELL
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:
T= 13 10 20 5 11
1 2 3 4 5
É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
Tri SHELL …Exemple
T= 13 10 20 5 11
1 2 3 4 5
É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
Tri SHELL …Exemple
T= 13 10 20 5 11
1 2 3 4 5
Étape 1…:Puisque P=4On 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:
Tri SHELL …Exemple
T= 11 10 20 5 13
1 2 3 4 5
É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=1On 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:
Tri SHELL …Exemple
T= 5 10 11 13 20
1 2 3 4 5
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
Fin Tantque
4) Fin Trier
calcul du plus grand décalage
possible
tant que le décalage possible est non nul
valeur à décaler (éventuellement)
décalage des valeurs avec un pas de p
Insertion de l’élément à sa place