Pourquoi le tri rapide peut-il être meilleur que le tri par fusion?
Voir Quicksort sur wikipedia :
En règle générale, le tri rapide est beaucoup plus rapide en pratique que les autres algorithmes Θ (nlogn), car sa boucle interne peut être efficacement mise en œuvre sur la plupart des architectures et, dans la plupart des données réelles, il est possible de faire des choix de conception minimisant la probabilité de nécessiter une configuration quadratique. temps.
Notez que l'exigence de mémoire très faible est également un avantage considérable.
Le tri rapide est généralement plus rapide que le tri par fusion lorsque les données sont stockées en mémoire. Cependant, lorsque le jeu de données est énorme et qu'il est stocké sur des périphériques externes tels qu'un disque dur, le tri par fusion est le grand gagnant en termes de vitesse. Il minimise les lectures coûteuses du lecteur externe et se prête bien au calcul parallèle.
Pour le tri par fusion, le pire des cas est O(n*log(n))
, pour le tri rapide: O(n
2)
. Pour les autres cas (moy, meilleur), les deux ont O(n*log(n))
. Cependant, le tri rapide est une constante d'espace où le tri par fusion dépend de la structure que vous triez.
Voir cette comparaison .
Vous pouvez également le voir visuellement .
Personnellement, je voulais tester la différence entre le tri rapide et le tri par fusion et voir les temps d'exécution pour un échantillon de 1 000 000 d'éléments.
Le tri rapide a pu le faire en 156 millisecondes alors que le tri par fusion a fait de même en 247 millisecondes
Cependant, les données de tri rapide étaient aléatoires et le tri rapide fonctionne bien si les données sont aléatoires, comme ce n’est pas le cas avec le tri par fusion, c’est-à-dire que le tri par fusion est identique ou non, que les données soient triées ou non. Mais le tri par fusion nécessite un espace supplémentaire complet et le tri rapide ne correspond pas au tri en place.
J'ai écrit un programme de travail complet pour eux aussi des images illustratives.
Bien que le tri rapide soit souvent un meilleur choix que le tri par fusion, il existe certainement des moments où le tri par fusion est le meilleur choix. Le moment le plus évident est celui où il est extrêmement important que votre algorithme soit exécuté plus rapidement que O (n ^ 2). Quicksort est généralement plus rapide que cela, mais compte tenu de la pire entrée théorique possible, il pourrait être exécuté en O (n ^ 2), ce qui est pire que le pire type de fusion possible.
Quicksort est également plus compliqué que mergesort, en particulier si vous souhaitez écrire une implémentation vraiment solide. Si vous visez simplicité et facilité de maintenance, le tri par fusion devient une alternative prometteuse avec très peu de perte de performances.
Quicksort est en place. Il vous suffit d'échanger les positions des données lors de la fonction de partitionnement. Mergesort nécessite beaucoup plus de copie de données. Vous avez besoin d'un autre stockage temporaire (généralement de la même taille que votre tableau de données d'origine) pour la fonction Fusionner.
En plus des autres: Le tri par fusion est très efficace pour les infrastructures de données immuables, telles que les listes chaînées, et constitue donc un bon choix pour les langages de programmation (purement) fonctionnels.
Un tri rapide mal implémenté peut être un risque de sécurité .
quicksort est nommé ainsi pour une raison,
faits saillants: les deux sont des types stables, (simplement une gêne pour la mise en œuvre), alors passons simplement aux complexités
son très déroutant avec juste les grandes-oh notations étant renversé et "abusé", les deux ont une complexité de cas moyenne de 0(nlogn),
mais le tri de fusion est toujours 0(nlogn), alors que le tri rapide pour les partitions mauvaises, c'est-à-dire les partitions asymétriques telles que 1 élément sur 10 (ce qui peut arriver en raison d'une liste triée ou triée inversement) peut entraîner une 0 (n ^ 2) ..
.. et donc nous avons randomisé quicksort, où nous choisissons le pivot de manière aléatoire et évitons un tel partitionnement asymétrique, annulant ainsi le scénario entier n ^ 2 malgré tout, même pour un partitionnement moyennement asymétrique comme 3-4, nous avons un nlog (7/4) n , idéalement nous voulons 1-1 partion, donc les 2 entiers de O (nlog (2) n).
il est donc O(nlogn), presque toujours et contrairement au tri par fusion, les constantes cachées sous la notation "big-oh" sont meilleures pour quicksort que pour mergesort .. et n'utilisent pas d'espace supplémentaire comme genre de fusion.
mais pour réussir à exécuter quicksort, vous devez peaufiner, reformuler, QuickSort vous offre la possibilité de modifier ....
La réponse inclinerait légèrement vers le tri rapide par rapport aux modifications apportées avec DualPivotQuickSort pour les valeurs primitives. Il est utilisé dans Java 7 pour trier dans Java.util.Arrays
It is proved that for the Dual-Pivot Quicksort the average number of
comparisons is 2*n*ln(n), the average number of swaps is 0.8*n*ln(n),
whereas classical Quicksort algorithm has 2*n*ln(n) and 1*n*ln(n)
respectively. Full mathematical proof see in attached proof.txt
and proof_add.txt files. Theoretical results are also confirmed
by experimental counting of the operations.
Vous pouvez trouver l'implémentation Java7 ici - http://grepcode.com/file/repository.grepcode.com/Java/root/jdk/openjdk/7-b147/Java/util/Arrays.Java
Lecture impressionnante sur DualPivotQuickSort - http://permalink.gmane.org/gmane.comp.Java.openjdk.core-libs.devel/2628
Ce n'est pas vrai que le tri rapide est meilleur. De plus, cela dépend de ce que vous entendez mieux, de la consommation de mémoire ou de la vitesse.
En termes de consommation de mémoire, dans le pire des cas, quicksort peut utiliser n ^ 2 mémoire (chaque partition est comprise entre 1 et n-1), alors que le tri par fusion utilise nlogn.
Ce qui précède suit en termes de vitesse.
Quicksort est en place. Vous avez besoin de très peu de mémoire supplémentaire. Ce qui est extrêmement important.
Un bon choix de médiane le rend encore plus efficace, mais même un mauvais choix de médiane digne de Theta (nlogn).