Tri fusion

Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.
Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.

Cet article ne cite pas suffisamment ses sources ().

Si vous disposez d'ouvrages ou d'articles de référence ou si vous connaissez des sites web de qualité traitant du thème abordé ici, merci de compléter l'article en donnant les références utiles à sa vérifiabilité et en les liant à la section « Notes et références ».

En pratique : Quelles sources sont attendues ? Comment ajouter mes sources ?
Tri fusion
Animation du tri par fusion
Découvreur ou inventeur
Date de découverte
Problèmes liés
Structures des données
Tableau, merge algorithm (en)Voir et modifier les données sur Wikidata
À l'origine de
Complexité en temps
Pire cas
Voir et modifier les données sur Wikidata
Moyenne
Voir et modifier les données sur Wikidata
Meilleur cas
Voir et modifier les données sur Wikidata
Complexité en espace
Pire cas
Voir et modifier les données sur Wikidata
Meilleur cas
Voir et modifier les données sur Wikidata
Tri fusion appliqué à un tableau de 7 éléments.

En informatique, le tri fusion est un algorithme de tri par comparaison stable. Sa complexité temporelle pour une entrée de taille n est de l'ordre de n log n, ce qui est asymptotiquement optimal. Ce tri est basé sur la technique algorithmique diviser pour régner.

L'opération principale de l'algorithme est la fusion, qui consiste à réunir deux listes triées en une seule. L'efficacité de l'algorithme vient du fait que deux listes triées peuvent être fusionnées en temps linéaire.

Le tri fusion se décrit naturellement sur des listes et c'est sur de telles structures qu'il est à la fois le plus simple et le plus rapide. Cependant, il fonctionne aussi sur des tableaux. La version la plus simple du tri fusion sur les tableaux a une efficacité comparable au tri rapide, mais elle n'opère pas en place : une zone temporaire de données supplémentaire de taille égale à celle de l'entrée est nécessaire (des versions plus complexes peuvent être effectuées sur place mais sont moins rapides). Sur les listes, sa complexité est optimale, il s'implémente très simplement et ne requiert pas de copie en mémoire temporaire.

Intuition

À partir de deux listes triées, on peut facilement construire une liste triée comportant les éléments issus de ces deux listes (leur fusion).

Le principe de l'algorithme de tri fusion repose sur cette observation : le plus petit élément de la liste à construire est soit le plus petit élément de la première liste, soit le plus petit élément de la deuxième liste.

Ainsi, on peut construire la liste élément par élément en retirant tantôt le premier élément de la première liste, tantôt le premier élément de la deuxième liste. E

Ce procédé est appelé fusion et est au cœur de l'algorithme de tri développé ci-après.

Algorithme

Algorithme animé.

L'algorithme diviser pour régner est naturellement décrit de façon récursive.

Pseudo-code

entrée : un tableau T
sortie : une permutation triée de T
fonction triFusion(T[1, …, n])
      si n ≤ 1
              renvoyer T
      sinon
              renvoyer interclasser(triFusion(T[1, …, n/2]), triFusion(T[n/2 + 1, …, n]))
entrée : deux tableaux triés A et B
sortie : un tableau trié qui contient exactement les éléments des tableaux A et B
fonction interclasser(A[1, …, a], B[1, …, b])
      si A est le tableau vide
              renvoyer B
      si B est le tableau vide
              renvoyer A
      si A[1] ≤ B[1]
              renvoyer A[1] ⊕ interclasser(A[2, …, a], B)
      sinon
              renvoyer B[1] ⊕ interclasser(A, B[2, …, b])

Terminaison

L'algorithme se termine car la taille du tableau à trier diminue strictement au fil des appels.

Analyse de la complexité

Complexité d'interclasser

L'on considère le cout de la fonction interclasser comme le nombre de comparaisons réalisées par cette fonction. L'interclassement de A et B effectue au plus comparaisons, avec la taille du tableau A et la taille du tableau B.

Complexité du Tri Fusion

L'interclassement de A et B est en où a est la taille de A et b est la taille de B. Le tri fusion d'un tableau T est en où n est la taille du tableau T. Le symbole ⊕ désigne ici la concaténation de tableaux.

Mise en œuvre sur des listes

L'algorithme suivant est détaillé de sorte qu'il soit traduisible en n'importe quel langage impératif. La liste à trier est de taille n. Pour la concision et l'efficacité de l'algorithme, on suppose que la liste à trier comporte au moins 2 éléments et que :

Dans tous les cas, la liste est triée après le chaînon p passé en paramètre, c'est-à-dire que le chainon successeur de p sera le plus petit de la liste. Des descriptions un peu moins concises mais libérées de ces contraintes structurelles existent.

fonction trier(p, n)
    Q := n/2 (division entière)
    P := n-Q
    si P >= 2
        q := trier(p, P)
        si Q >= 2 
            trier(q, Q)
    sinon
        q := p.suivant
    fin
    q := fusionner(p, P, q, Q)
    renvoyer q
fin

fonction fusionner(p, P, q, Q)
    pour i allant de 0 à taille(p)-1 faire
        si valeur(p.suivant) > valeur(q.suivant) 
            déplacer le maillon q.suivant après le maillon p
            si Q = 1 quitter la boucle
            Q := Q-1
        sinon
            si P = 1
                tant que Q >= 1
                    q := q.suivant
                    Q := Q-1
                fin
                quitter la boucle
            fin
            P := P-1
        fin
        p := p.suivant
    fin
    renvoyer q
fin

Le déplacement d'un maillon q.suivant après un maillon p nécessite un pointeur temporaire t. Si la liste est simplement chainée, le déplacement se fait par cet échange de liens :

t := q.suivant
q.suivant := t.suivant
t.suivant := p.suivant
p.suivant := t

Si la liste est doublement chainée et circulaire, le déplacement se fait par cet échange de liens :

t := q.suivant

q.suivant := t.suivant
q.suivant.précédent := q

t.précédent := p
t.suivant := p.suivant
p.suivant.précédent := t
p.suivant := t

Ainsi décrit, l'algorithme peut être hybridé très facilement avec d'autres tris. Cela se fait en rajoutant une condition sur la toute première ligne de la fonction trier(p, n). Sur de petites sous-listes, elle a pour rôle de remplacer toutes les opérations qui suivent par un tri de complexité quadratique mais en pratique plus rapide. Dans la suite, les conditions P >= 2 et Q >= 2 peuvent alors être retirées.

Mise en œuvre sur des tableaux

Avec des tableaux, on peut faire le tri sur place ou non. On a alors schématiquement trois possibilités de gestion de la mémoire :

Propriétés

Optimisations possibles

Exemple

Opération de fusion

Fusionner [1;2;5] et [3;4] : le premier élément de la liste fusionnée sera le premier élément d'une des deux listes d'entrée (soit 1, soit 3) car ce sont des listes triées.

Tri, procédure complète

Déroulons les appels successifs de tri_fusion([6, 1, 2, 5, 4, 7, 3]) :

tri_fusion([6, 1, 2, 5, 4, 7, 3])
    [6, 1, 2, 5] [4, 7, 3]
    tri_fusion([6, 1, 2, 5])
        [6, 1] [2, 5]
        tri_fusion([6, 1])
            [6] [1]
            tri_fusion([6])
            --> [6]
            tri_fusion([1])
            --> [1]
            '''fusion''' de [6] et [1] : [1, 6]
        --> [1, 6]
        tri_fusion([2, 5])
            [2] [5]
            tri_fusion([2])
            --> [2]
            tri_fusion([5])
            --> [5]
            '''fusion''' de [2] et [5] : [2, 5]
        --> [2, 5]
        '''fusion''' de [1, 6] et [2, 5] : [1, 2, 5, 6]
    --> [1, 2, 5, 6]
    tri_fusion([4, 7, 3])
        [4] [7, 3]
        tri_fusion([4])
        --> [4]
        tri_fusion([7, 3])
            [7] [3]
            tri_fusion([7])
            --> [7]
            tri_fusion([3])
            --> [3]
            '''fusion''' de [7] et [3] : [3, 7]
        --> [3, 7]
        '''fusion''' de [4] et [3, 7] : [3, 4, 7]
    --> [3, 4, 7]
    '''fusion''' de [1, 2, 5, 6] et [3, 4, 7] : [1, 2, 3, 4, 5, 6, 7]
--> [1, 2, 3, 4, 5, 6, 7]

On peut remarquer que la fonction de fusion est toujours appelée sur des listes triées.

Notes et références

  1. ↑ Steven Skiena, The Algorithm Design Manual (œuvre écrite), , p. 122.Voir et modifier les données sur Wikidata
  2. 1 2 Danièle Beauquier, Jean Berstel et Philippe Chrétienne, Éléments d'algorithmique, Masson, coll. « Manuels informatiques masson », (ISBN 978-2-225-82704-4)

Voir aussi

Bibliographie

Sur les autres projets Wikimedia :

Liens externes