Numérique et Sciences Informatiques > Algorithmique : Tris et Recherche > Algorithmes de Tri Efficaces > Tri fusion (Mergesort)
Tri Fusion (Mergesort) : Un Guide Complet
Comprendre le tri fusion (Mergesort) : algorithme de tri efficace, explication pas à pas, exemples concrets et complexité. Parfait pour les élèves de lycée en NSI.
Introduction au Tri Fusion
Le tri fusion, ou Mergesort, est un algorithme de tri basé sur le paradigme diviser pour régner. Il divise récursivement une liste en sous-listes plus petites jusqu'à ce que chaque sous-liste ne contienne qu'un seul élément. Ensuite, il fusionne ces sous-listes de manière répétée pour produire de nouvelles sous-listes triées, jusqu'à obtenir une seule liste triée. C'est un algorithme de tri stable et efficace, particulièrement performant pour de grands ensembles de données.
Contrairement à certains algorithmes de tri qui peuvent être plus intuitifs à première vue (comme le tri par insertion ou le tri à bulles), le tri fusion excelle en performance grâce à son approche systématique et sa complexité temporelle avantageuse.
Principe de l'Algorithme : Diviser pour Régner
Le principe fondamental du tri fusion est de décomposer le problème initial (trier une liste) en sous-problèmes plus simples, puis de combiner les solutions de ces sous-problèmes pour obtenir la solution globale.
Voici les étapes clés :
L'Étape de Fusion : Le Cœur de l'Algorithme
L'étape de fusion est l'opération qui combine deux listes triées en une seule liste triée. Voici comment elle fonctionne en détail :
1. Initialisation : On utilise deux pointeurs (indices), un pour chaque liste triée. Ils pointent initialement sur le premier élément de chaque liste.
2. Comparaison et Ajout : On compare les éléments pointés par les deux pointeurs. Le plus petit des deux éléments est ajouté à la liste fusionnée. Le pointeur de la liste contenant l'élément ajouté est ensuite incrémenté pour pointer vers l'élément suivant.
3. Répétition : L'étape 2 est répétée jusqu'à ce que l'un des pointeurs atteigne la fin de sa liste.
4. Ajout des Éléments Restants : Une fois qu'une des listes est entièrement parcourue, tous les éléments restants de l'autre liste sont ajoutés à la fin de la liste fusionnée (ils sont déjà triés).
Exemple :
Soient deux listes triées : [1, 3, 5]
et [2, 4, 6]
.Étape Liste 1 Liste 2 Liste Fusionnée Départ [1, 3, 5] (pointeur sur 1) [2, 4, 6] (pointeur sur 2) [] 1 [1, 3, 5] (pointeur sur 3) [2, 4, 6] (pointeur sur 2) [1] 2 [1, 3, 5] (pointeur sur 3) [2, 4, 6] (pointeur sur 4) [1, 2] 3 [1, 3, 5] (pointeur sur 3) [2, 4, 6] (pointeur sur 4) [1, 2, 3] 4 [1, 3, 5] (pointeur sur 5) [2, 4, 6] (pointeur sur 4) [1, 2, 3, 4] 5 [1, 3, 5] (pointeur sur 5) [2, 4, 6] (pointeur sur 6) [1, 2, 3, 4, 5] Fin [1, 3, 5] (fin) [2, 4, 6] (pointeur sur 6) [1, 2, 3, 4, 5, 6]
Implémentation en Python
Voici une implémentation simple du tri fusion en Python :def tri_fusion(liste):
if len(liste) <= 1:
return liste
milieu = len(liste) // 2
gauche = liste[:milieu]
droite = liste[milieu:]
gauche = tri_fusion(gauche)
droite = tri_fusion(droite)
return fusion(gauche, droite)
def fusion(gauche, droite):
fusionne = []
i = j = 0
while i < len(gauche) and j < len(droite):
if gauche[i] < droite[j]:
fusionne.append(gauche[i])
i += 1
else:
fusionne.append(droite[j])
j += 1
fusionne += gauche[i:]
fusionne += droite[j:]
return fusionne
# Exemple d'utilisation
liste_non_triee = [12, 11, 13, 5, 6, 7]
liste_triee = tri_fusion(liste_non_triee)
print(liste_triee) # Output: [5, 6, 7, 11, 12, 13]
Explication du code :tri_fusion
divise la liste en deux, appelle récursivement tri_fusion
sur chaque moitié, puis fusionne les résultats avec la fonction fusion
.fusion
prend deux listes triées en entrée et les fusionne en une seule liste triée, comme expliqué précédemment.
Complexité du Tri Fusion
Le tri fusion a une complexité temporelle de O(n log n) dans tous les cas (meilleur, moyen et pire). Cela signifie que le temps d'exécution de l'algorithme croît de manière proportionnelle à n log n, où n est le nombre d'éléments dans la liste à trier. Cette complexité en fait un algorithme de tri très performant, surtout pour les grandes listes.
La complexité spatiale du tri fusion est de O(n), car il nécessite un espace supplémentaire pour stocker les sous-listes lors de la fusion. Bien que cet espace supplémentaire puisse être un inconvénient dans certains cas, la performance globale de l'algorithme justifie souvent son utilisation.
Avantages et Inconvénients
Avantages :
Inconvénients :
Ce qu'il faut retenir
FAQ
-
Pourquoi le tri fusion est-il plus efficace que le tri à bulles pour les grandes listes ?
Le tri à bulles a une complexité temporelle de O(n^2), ce qui signifie que le temps d'exécution augmente de manière quadratique avec la taille de la liste. Pour les grandes listes, cela devient prohibitif. Le tri fusion, avec sa complexité de O(n log n), croît beaucoup plus lentement, ce qui le rend beaucoup plus rapide pour les grandes quantités de données. -
Qu'est-ce que signifie la stabilité d'un algorithme de tri ?
Un algorithme de tri est dit stable s'il préserve l'ordre relatif des éléments égaux. Par exemple, si une liste contient deux éléments avec la même valeur, leur ordre d'apparition dans la liste triée sera le même que dans la liste d'origine. Le tri fusion est un algorithme stable.