J'ai rencontré de nombreux algorithmes de tri au cours de mes études secondaires. Cependant, je ne sais jamais lequel est le plus rapide (pour un tableau aléatoire d'entiers). Donc mes questions sont:
- Quel est l'algorithme de tri le plus rapide actuellement connu?
- Théoriquement, est-il possible qu'il y en ait des plus rapides? Alors, quelle est la moindre complexité pour le tri?
Réponses:
De manière générale, il existe les algorithmes de tri , tels que le tri par insertion, le tri par bulle et le tri par sélection, que vous ne devriez normalement utiliser que dans des circonstances spéciales; Quicksort, qui est le cas le plus défavorable mais assez souvent avec de bonnes constantes et propriétés et qui peut être utilisé comme procédure de tri polyvalente; les algorithmes , tels que merge-sort et heap-sort, qui sont également de bons algorithmes de tri à usage général; et les algorithmes de tri , ou linéaire, pour les listes d'entiers, tels que les tris de base, les tranches et les triages de comptage, qui peuvent convenir en fonction de la nature des entiers dans vos listes.O ( n 2 ) O ( n log n ) O ( n log n ) O ( n )O ( n2) O ( n2) O ( n logn ) O ( n logn ) O ( n )
Si les éléments de votre liste sont tels que tout ce que vous savez à leur sujet est la relation d'ordre total qui les sépare, les algorithmes de tri optimaux auront alors la complexité . Il s’agit d’un résultat plutôt intéressant, pour lequel vous devriez pouvoir trouver facilement des détails en ligne. Les algorithmes de tri linéaire exploitent des informations supplémentaires sur la structure des éléments à trier, plutôt que la relation d'ordre total entre les éléments.Ω ( n logn )
De manière encore plus générale, l’optimalité d’un algorithme de tri dépend intimement des hypothèses que vous pouvez faire sur le type de listes que vous allez trier (ainsi que sur le modèle de machine sur lequel l’algorithme sera exécuté, ce qui peut entraîner un mauvais tri sinon les algorithmes sont le meilleur choix; envisagez le tri à bulle sur les machines avec une bande pour le stockage). Plus vos hypothèses sont fortes, plus votre algorithme peut couper les angles. Sous des hypothèses très faibles sur l'efficacité avec laquelle vous pouvez déterminer le "tri" d'une liste, la complexité optimale dans le pire des cas peut même être .Ω ( n ! )
Cette réponse ne traite que des complexités. La durée d'exécution réelle des implémentations d'algorithmes dépendra d'un grand nombre de facteurs qu'il est difficile de prendre en compte dans une réponse unique.
la source
La réponse, comme c'est souvent le cas pour de telles questions, est "ça dépend". Cela dépend de facteurs tels que (a) la taille des entiers, (b) si le tableau en entrée contient des entiers dans un ordre aléatoire ou dans un ordre presque trié, (c) si vous avez besoin que l'algorithme de tri soit stable ou non, ainsi que d'autres facteurs, (d) si la liste complète des nombres est ou non mémorisée (tri en mémoire ou tri externe), et (e) la machine sur laquelle vous l'exécutez.
En pratique, l'algorithme de tri de la bibliothèque standard de votre langue sera probablement assez bon (assez proche de l'optimum), si vous avez besoin d'un tri en mémoire. Par conséquent, dans la pratique, utilisez simplement la fonction de tri fournie par la bibliothèque standard et mesurez le temps d'exécution. Ce n'est que si vous constatez que (i) le tri représente une fraction importante du temps total d'exécution et que (ii) le temps d'exécution est inacceptable, si vous vous donnez la peine de jouer avec l'algorithme de tri. Si ces deux conditions sont remplies, vous pouvez alors examiner les aspects spécifiques de votre domaine particulier et expérimenter avec d'autres algorithmes de tri rapide.
Mais de manière réaliste, en pratique, l’algorithme de tri est rarement un goulot d’étranglement majeur en termes de performances.
la source
En outre, répondre à votre deuxième question
Pour le tri d'usage général, la complexité du problème de tri fondé sur la comparaison est Ω (n log n) . Certains algorithmes effectuent le tri dans O (n), mais ils reposent tous sur des suppositions relatives à l'entrée et ne sont pas des algorithmes de tri à usage général.
Fondamentalement, la complexité est donnée par le nombre minimum de comparaisons nécessaires pour trier le tableau (log n représente la hauteur maximale d'un arbre de décision binaire construit lors de la comparaison de chaque élément du tableau).
Vous pouvez trouver la preuve formelle de la complexité de tri ici :
la source
L'algorithme de tri le plus rapide en termes de pire cas que j'ai rencontré est celui d' Andersson et al. Il a le pire cas de , ce qui est bien sûr plus rapide que O ( n log n ) .O ( n logbûchen ) O ( n logn )
la source
J'ai lu les deux autres réponses au moment d'écrire ces lignes et je ne pensais pas que ni l'une ni l'autre de vos réponses ne répondent à votre question de manière appropriée. D'autres réponses ont porté sur des idées superflues sur les distributions aléatoires et la complexité de l'espace, qui sont probablement hors de portée des études secondaires. Alors voici ma prise.
Etant donné un tableau avec n éléments entiers, vous avez besoin d’exactement ( n - 1 ) comparaisons entre les éléments pour vérifier si A est trié (commencez simplement au début du tableau et vérifiez l’élément suivant par rapport au dernier élément). En fait, les comparaisons ( n - 1 ) constituent le temps d'exécution optimal pour tout algorithme de tri . En d'autres termes, la limite inférieure du temps d'exécution pour tout algorithme de tri est Ω ( n ) . Si vous vous rappelez un type de base ou un type de seau, vous remarquerez que leurs temps d'exécution sont O ( nUNE n ( n - 1 ) UNE ( n - 1 ) Ω ( n ) . Puisque tous les algorithmes de tri sont liés ci-dessous par Ω ( n ) , je dirais que le tri de base et le tri de compartiment sont les algorithmes les plus rapides pour trier un tableau d'entiers.O ( n ) Ω ( n )
De plus, si vous n'êtes pas familier avec ce que ou O ( n ) : Les deux notations signifient que l'algorithme nécessite environ n opérations à compléter (peut être 2 n ou 3 n - 5 , mais pas 1 ou n 2 opérations) .Ω ( n ) O ( n ) n 2 n 3 n - 5 1 n2
la source
la source
la source
Comme vous ne mentionnez aucune restriction sur le matériel et que vous recherchez "le plus rapide", je vous conseillerais de choisir l'un des algorithmes de tri en parallèle en fonction du matériel disponible et du type de saisie dont vous disposez.
En théorie, par exemple
quick_sort
estO(n log n)
. Avec lesp
processeurs, idéalement, cela devrait se résumerO(n/p log n)
si nous le faisons en parallèle.Pour citer Wikipedia: la complexité temporelle de ...
En pratique, il serait impossible de réaliser des tailles d’entrée massives en
O(log n)
raison de problèmes d’évolutivité.Voici le pseudo-code pour le tri par fusion parallèle . L'implémentation de
merge()
peut être la même que dans le type de fusion normal:Regarde aussi:
la source