Il n'y a pas un seul algorithme qui soit clairement le meilleur algorithme. Cela dépend d'un tas de facteurs.
Pour commencer, pouvez-vous adapter vos données dans la mémoire principale? Si vous ne le pouvez pas, vous devez utiliser un algorithme de tri externe. Ces algorithmes sont souvent basés sur quicksort et mergesort. Deuxièmement, savez-vous quelque chose au sujet de votre distribution d'entrée? Si c'est principalement trié, alors quelque chose comme Timsort peut être une excellente option, car il est conçu pour fonctionner correctement sur les données triées. Si c'est plutôt aléatoire, Timsort n'est probablement pas un bon choix.
Troisièmement, quels types d'éléments triez-vous? Si vous triez des objets génériques, vous êtes à peu près limité au tri par comparaison. Sinon, vous pourriez peut-être utiliser un tri sans comparaison comme le tri par comptage ou le tri radix.
Quatrièmement, combien de noyaux avez-vous? Certains algorithmes de tri (quicksort, mergesort, tri de base MSD) se mettent en parallèle très bien, alors que d'autres ne le font pas (heapsort).
Cinquièmement, comment vos données sont-elles représentées? Si elles sont stockées dans un tableau, quicksort ou une variante de quicksort fera probablement bien à cause de la localité de référence, tandis que mergesort pourrait être lent en raison de la mémoire supplémentaire nécessaire. S'ils sont dans une liste chaînée, cependant, la localité de référence de quicksort disparaît et mergesort redevient soudain compétitif. La meilleure option est probablement de prendre en compte un grand nombre de facteurs différents, puis de prendre une décision à partir de là. Une des raisons pour lesquelles il est si amusant de concevoir et d'étudier des algorithmes est qu'il y a rarement un seul meilleur choix; Souvent, la meilleure option dépend d'une tonne sur votre situation particulière et des changements basés sur ce que vous voyez.
(Vous avez mentionné quelques détails sur quicksort, heapsort et mergesort que je voulais aborder avant de conclure cette réponse. Alors que vous avez raison que quicksort a un O dégénéré (n) pire des cas, il L'algorithme introsort garde trace de la profondeur de récursivité et fait passer l'algorithme à heapsort s'il semble que le quicksort dégénère, ce qui garantit O (n log n) pire comportement avec un minimum de mémoire et maximise le quicksort randomisé, tout en ayant un O (n) pire cas, a une probabilité infinitésimale de toucher réellement ce pire des cas
Heapsort est un bon algorithme en pratique, mais n'est pas aussi rapide que les autres algorithmes dans certains cas car il n'a pas une bonne localisation de référence. Cela dit, le fait qu'il ne dégénère jamais et n'a besoin que de l'espace auxiliaire O (1) est un énorme argument de vente.
Mergesort a besoin de beaucoup de mémoire auxiliaire, ce qui est une des raisons pour lesquelles vous ne voudrez peut-être pas l'utiliser si vous avez besoin de beaucoup de données à trier. Cela vaut la peine de le savoir, car ses variantes sont largement utilisées.)
"Très grand" est assez vague. – Sneftel
Mergesort sur une liste liée prend de l'espace constant et est toujours stable, de sorte que votre souci de l'espace peut être invalide. Il fonctionne également très bien sur les fichiers et peut utiliser plusieurs processeurs. – erickson
http://www.sorting-algorithms.com/ a un affichage amusant de certaines des variables et des compromis impliqués. –