Menu
Coddy logo textTech

Merge Sort

Dernière mise à jour

Le tri fusion est un algorithme de type diviser pour régner. Il divise récursivement le tableau en deux jusqu'à ce que chaque morceau ne contienne qu'un seul élément (trivialement trié), puis fusionne les morceaux dans l'ordre. L'étape de fusion parcourt deux sous-tableaux triés avec deux pointeurs, en copiant toujours le plus petit élément de tête. Appuyez sur lecture ci-dessus pour voir le tableau se reconstruire fusion après fusion.

Comme il divise toujours en deux, le tri fusion s'exécute en temps O(n log n) dans tous les cas : son pire cas est aussi bon que son meilleur cas. En contrepartie, il utilise O(n) d'espace supplémentaire pour le tampon de fusion temporaire.

Complexité en temps et en espace

CasComplexitéRemarques
Meilleur casO(n log n)Divise toujours l'entrée en deux
Cas moyenO(n log n)Ordre aléatoire
Pire casO(n log n)Garanti - aucune mauvaise entrée
EspaceO(n)Tampon temporaire pour la fusion
StableOuiÉgalités résolues par la gauche lors de la fusion

Étape par étape

ÉtapeCe qui se passe
1Si la plage a 0 ou 1 élément, elle est déjà triée.
2Divise la plage en deux moitiés.
3Trie récursivement la moitié gauche par tri fusion.
4Trie récursivement la moitié droite par tri fusion.
5Fusionne les deux moitiés triées avec deux pointeurs.

Exemple détaillé

Tri de [5, 2, 4, 1] :

PasseTableauAction
Diviser[5, 2] | [4, 1]Divise le tableau en deux moitiés
Diviser[5] [2] | [4] [1]Divise encore jusqu'à ce que chaque morceau soit un seul élément
Fusionner[2, 5] | [1, 4]Fusionne [5],[2] en [2, 5] et [4],[1] en [1, 4]
Fusionner[1, 2, 4, 5]Fusionne [2, 5] et [1, 4] : choisit 1, puis 2, puis 4, puis 5
Terminé[1, 2, 4, 5]Le tableau est entièrement trié

Quand utiliser le tri fusion

À utiliser quandÀ éviter quand
Vous avez besoin d'un pire cas garanti en O(n log n)La mémoire est limitée et O(n) d'espace supplémentaire est inacceptable
La stabilité compte (les clés égales gardent leur ordre)Vous triez de petits tableaux où le tri par insertion est plus rapide
Vous triez une liste chaînéeLe tri en place est une exigence stricte
Les données sont trop grandes pour la RAM (tri externe)La localité de cache domine et les passes en place de quicksort gagnent

Code de Merge Sort

Une implémentation propre et exécutable de Merge Sort en Python, JavaScript, Java, C++, C. Choisissez un langage, copiez le code ou ouvrez-le préchargé dans le Playground Coddy.

Code de Merge Sort en Python

Python
1def merge_sort(a):2    if len(a) <= 1:3        return a4    mid = len(a) // 25    left = merge_sort(a[:mid])6    right = merge_sort(a[mid:])7    return merge(left, right)8
9
10def merge(left, right):11    out = []12    i = j = 013    while i < len(left) and j < len(right):14        if left[i] <= right[j]:15            out.append(left[i])16            i += 117        else:18            out.append(right[j])19            j += 120    out.extend(left[i:])21    out.extend(right[j:])22    return out23
24
25nums = [38, 27, 43, 3, 9, 82, 10]26print("Before:", nums)27print("After: ", merge_sort(nums))
Exécutez ce code dans le Playground Python

FAQ sur le tri fusion

Quelle est la complexité temporelle du tri fusion ?
Le tri fusion est en O(n log n) dans le meilleur, le pire et le cas moyen, car il divise toujours le tableau en deux. Il utilise O(n) d'espace supplémentaire pour le tampon de fusion.
Le tri fusion est-il stable ?
Oui, lorsque l'étape de fusion résout les égalités en prenant d'abord dans la moitié gauche. Cela conserve les éléments égaux dans leur ordre relatif d'origine, c'est pourquoi le tri fusion est un choix courant pour le tri stable.
Pourquoi utiliser le tri fusion plutôt que quicksort ?
Le tri fusion garantit O(n log n) même sur des entrées adverses et est stable, alors que quicksort peut se dégrader en O(n²). Le tri fusion est aussi préféré pour les listes chaînées et le tri externe. L'inconvénient est sa mémoire supplémentaire en O(n).
Quelle est la différence entre le tri fusion et quicksort ?
Les deux sont des tris de type diviser pour régner, mais quicksort partitionne autour d'un pivot et trie en place avec O(log n) d'espace de pile, tandis que le tri fusion divise aveuglément en deux et fusionne avec un tampon en O(n). Quicksort est généralement plus rapide en pratique grâce à la localité de cache, mais le tri fusion a un pire cas garanti en O(n log n) et est stable.
Quand devrais-je utiliser le tri fusion en pratique ?
Optez pour le tri fusion quand vous avez besoin d'un tri stable avec une borne garantie en O(n log n), pour trier des listes chaînées (où il n'a pas besoin d'accès aléatoire), ou pour le tri externe de données trop volumineuses pour la mémoire. Évitez-le quand la mémoire est rare, car il nécessite O(n) d'espace supplémentaire.
Le tri fusion trie-t-il en place ?
Non. Le tri fusion standard alloue un tampon temporaire en O(n) pour fusionner les deux moitiés, il n'est donc pas en place. Des variantes de fusion en place existent, mais elles sont complexes et soit plus lentes soit perdent la stabilité, donc la version à tampon reste le choix courant.
Coddy programming languages illustration

Maîtrisez les algorithmes avec Coddy

COMMENCER