Algorithmes de Tri Chapitre 6
– Ecrire une fonction (très simple) Swap(T, i, j) qui échange dans le tableau T les valeurs aux indexes iet j.
– Trouver une manière d’énumérer tous les couples interchangeable [1..N ]×[1..N].
Aide : Utiliser deux boucles FOR imbriqués
– En déduire l’algorithme de Tri par sélection : TriSelect(T).
D’un point de vue performance :
On a dans tous les cas au moins N(N+1)
2comparaisons. Dans le meilleur cas on peut s’affranchir des échanges. Mais cela ne
fait que changer la constante devant. On a donc :
En pire et meilleur cas, l’algorithme de Tri Sélection a un coût en O(N2)
3 Tri bulle
5 2 3 1 4
2 3 1 4 2 3 1 45 5 2 3 1 45 2 3 1 4 5
31 4 51 4 5
2 2 31 4 5
23
1 4 532 1 4 532
1 4 53
2
FIG. 1 – Etapes du tri bulle
Sans être bien plus performant, il est assez drôle de connaître le fameux
tri bubulle. Son principe réside sur le fait que si on effectue des échanges de
valeurs voisines successifs, on propage des valeurs triés en fin de liste.
La Fig. 1 explique le fonctionnement de l’algorithme. La flèche indique
l’index sur lequel est l’une des variables d’une boucle for qui sera utilisée.
En clair on parcourt le moins de fois possible le tableau en largeur et si on
rencontre deux valeurs voisines qui ne sont pas rangés alors on échange les
valeurs.
On appelle cet algorithme le tri bulle car si on regarde les déplacements
des éléments. Ils remontent petit à petit et ne s’arrêtent que quand ils sont à
leur place.
Ex 2:
– Ecrire l’algorithme du Tri Bulle.
Aide : Utiliser deux boucles FOR imbriqués
– Imaginez une ruse (simple) pour éviter de faire des parcours inutiles. Le tri
bulle sur une liste trié doit être très rapide.
D’un point de vue performance, on est identique à l’algorithme de sélection mais on a une meilleure analyse d’une liste triée
qui se verra très vite trouvée en Ncomparaisons.
En pire cas l’algorithme de Tri Bulle a un coût en O(N2). En meilleur cas il est en O(N).
3.1 Pour ceux qui sont en avance : Le tri fusion
Là on rentre dans la catégorie des algorithmes efficaces; donc un peu plus bizarres. Histoire de bien vous embêter, j’ai choisi
un algorithme de tri qui se fait de façon récursif (oui je sais je suis méchant).
Cet algorithme réside sur une principe simple :
1. Je prends une liste
2. Je la découpe en deux bouts
3. Je relance le tri sur ces deux bouts
4. Je fusionne ces deux bouts triés en une liste complètement triée
Ex 3:
– Ecrire une fonction Fusion(T1, T2) qui à partir de deux listes triées, renvoie une liste qui fusionne les deux en une seule de façon triée.
– En déduire l’algorithme récursif du Tri Fusion (la découpe se fera au milieu).
Aide : Ne pas oublier la condition de terminaison
L’analyse de performance ne peut pas se faire à votre niveau. Mais si on dessine un arbre des découpages et des fusions. On
peut voir que on aura environ log2Nfusions. Chacune de ces fusions sera de coup de l’ordre de N. Ainsi on a :
En pire et meilleur cas, l’algorithme de Tri Fusion a un coût en O(Nlog2N)
Toutefois, ce tri requiert plus de place mémoire que les autres (l’opération de fusion requiert un tableau supplémentaire). En
effet, lorsqu’on fait une analyse de performance, on calcule le nombre d’opérations, mais aussi le coût mémoire engendré.
Pour les accros qui en veulent plus : L’algorithme de Tri Fusion est très performant mais n’est pas le meilleur. Vous pouvez
vous documentersur l’algorithme du QuickSort qui est une méthode prochede la fusion mais qui a un coût en pire cas de O(n2).
Toutefois, en moyenne on se rend compte qu’on a O(Nlog 2N)opérations avec un coût mémoire O(log2N)dans les versions
les plus optimisés.
2 Loïc Frère TEXPetit