web-dev-qa-db-fra.com

Quand le tri par fusion est préféré au tri rapide?

Le tri rapide est bien meilleur que le tri par fusion dans de nombreux cas. Cependant, dans quels cas le tri par fusion pourrait-il être une meilleure solution que le tri rapide?

Par exemple, le tri par fusion fonctionne mieux que le tri rapide lorsque les données ne peuvent pas être chargées en mémoire à la fois. Y a-t-il d'autres cas?

EDIT: les réponses à la liste de questions en double suggérées présentent tous les avantages du tri rapide par rapport au tri par fusion. Je demande ici quels sont les cas et les applications possibles selon lesquels le tri par fusion serait avantageux que le tri rapide.

26

Je devrais probablement commencer par mentionner que quicksort et mergesort peuvent très bien fonctionner si vous ne pouvez pas tout mettre en mémoire en même temps. Vous pouvez implémenter le tri rapide en choisissant un pivot, puis en diffusant des éléments du disque dans la mémoire et en écrivant des éléments dans l'un des deux fichiers différents en fonction de la façon dont cet élément se compare au pivot. Si vous utilisez une file d'attente prioritaire à double extrémité, vous pouvez réellement le faire encore plus efficacement en ajustant le nombre maximal d'éléments possibles en mémoire à la fois.

D'autres ont mentionné l'avantage que mergesort est le pire des cas O (n log n), ce qui est certainement vrai. Cela dit, vous pouvez facilement modifier quicksort pour produire l'algorithme introsort , un hybride entre quicksort, tri par insertion et heapsort, c'est le pire des cas O (n log n) mais conserve la vitesse de quicksort dans la plupart cas.

Il pourrait être utile de voir pourquoi quicksort est généralement plus rapide que mergesort, car si vous comprenez les raisons, vous pouvez trouver assez rapidement des cas où mergesort est clairement gagnant. Quicksort est généralement meilleur que mergesort pour deux raisons:

  1. Quicksort a une meilleure localité de référence que mergesort, ce qui signifie que les accès effectués dans quicksort sont généralement plus rapides que les accès correspondants dans mergesort.

  2. Quicksort utilise la pire mémoire O (log n) (si elle est implémentée correctement), tandis que mergesort requiert O(n) mémoire en raison de la surcharge de la fusion).

Il y a un scénario, cependant, où ces avantages disparaissent. Supposons que vous souhaitiez trier une liste d'éléments liée. Les éléments de la liste liée sont dispersés dans la mémoire, donc l'avantage (1) disparaît (il n'y a pas de localité de référence). Deuxièmement, les listes liées peuvent être fusionnées avec seulement O(1) surcharge d'espace au lieu de O(n) surcharge d'espace, donc l'avantage (2) disparaît. Par conséquent, , vous constaterez généralement que mergesort est un algorithme supérieur pour trier les listes liées, car il fait moins de comparaisons totales et n'est pas susceptible d'un mauvais choix de pivot.

J'espère que cela t'aides!

38
templatetypedef
  1. MergeSort est stable par conception, les éléments égaux conservent leur ordre d'origine.
  2. MergeSort est bien adapté pour être implémenté en parallèle (multithreading).
  3. MergeSort utilise (environ 30%) moins de comparaisons que QuickSort. C'est un avantage souvent négligé, car une comparaison peut être assez coûteuse (par exemple lors de la comparaison de plusieurs champs de lignes de base de données).
9
martinstoeckli

Un avantage le plus important du tri par fusion par rapport au tri rapide est sa stabilité: les éléments comparés égaux conservent leur ordre d'origine.

8
user58697

Quicksort est le cas moyen O (n log n), mais a le pire cas de O (n ^ 2). Mergesort est toujours O (n log n). Outre le pire cas asymptotique et le chargement de mémoire de fusion, je ne peux pas penser à une autre raison.

Scénarios où quicksort est pire que mergesort:

  1. Le tableau est déjà trié.
  2. Tous les éléments du tableau sont identiques.
  3. Le tableau est trié dans l'ordre inverse.

Prenez mergesort plutôt que quicksort si vous ne savez rien des données.

5
erip

Le tri par fusion a une limite supérieure garantie de O (N log2N). Le tri rapide a également une telle limite, mais il est beaucoup plus élevé - c'est O (N2). Lorsque vous avez besoin d'une limite supérieure garantie sur le timing de votre code, utilisez le tri par fusion plutôt que le tri rapide.

Par exemple, si vous écrivez du code pour un système en temps réel qui repose sur le tri, le tri par fusion serait un meilleur choix.

3
dasblinkenlight
  1. Merge Sort La pire complexité de cas est O(nlogn) tandis que Quick pire cas est O (n ^ 2).
  2. Le tri par fusion est un tri stable, ce qui signifie que le même élément d'un tableau conserve sa position d'origine les uns par rapport aux autres.
1
Shantam Mittal