Algorithme de tri

bien qu’il existe un grand nombre d’algorithmes de tri, dans les implémentations pratiques, quelques algorithmes prédominent. Le tri par Insertion est largement utilisé pour les petits ensembles de données, tandis que pour les grands ensembles de données, un tri asymptotiquement efficace est utilisé, principalement le tri par tas, le tri par fusion ou le tri rapide. Les implémentations efficaces utilisent généralement un algorithme hybride, combinant un algorithme asymptotiquement efficace pour le tri global avec le tri par insertion pour les petites listes au bas d’une récursivité., Les implémentations hautement réglées utilisent des variantes plus sophistiquées, telles que Timsort (Tri par fusion, Tri par insertion et logique supplémentaire), utilisé dans Android, Java et Python, et introsort (tri rapide et Tri par tas), utilisé (sous forme de variantes) dans certaines implémentations de tri C++ et dans .NET.

pour les données plus restreintes, telles que les nombres dans un intervalle fixe, les types de distribution tels que Le tri et les variantes de bulles sont rarement utilisés dans la pratique, mais se retrouvent couramment dans l’enseignement et les discussions théoriques.,

lors du tri physique d’objets (tels que l’alphabétisation de papiers, de tests ou de livres), les gens utilisent intuitivement généralement des sortes d’insertion pour les petits ensembles. Pour les plus grands ensembles, les gens souvent premier seau, comme par lettre initiale, et plusieurs bucket permet le tri pratique de très grands ensembles. Souvent, l’espace est relativement bon marché, par exemple en étalant des objets sur le sol ou sur une grande surface, mais les opérations sont coûteuses, en particulier en déplaçant un objet à une grande distance – la localité de référence est importante., Les sortes de fusion sont également pratiques pour les objets physiques, en particulier car deux mains peuvent être utilisées, une pour chaque liste à fusionner, tandis que d’autres algorithmes, tels que le tri par tas ou le tri rapide, sont mal adaptés à une utilisation humaine. D’autres algorithmes, tels que le tri de bibliothèque, une variante du tri par insertion qui laisse des espaces, sont également pratiques pour une utilisation physique.

simple sortsEdit

deux des types les plus simples sont le tri par insertion et le tri par sélection, qui sont tous deux efficaces sur les petites données, en raison de la faible surcharge, mais pas efficaces sur les grandes données., Le tri par Insertion est généralement plus rapide que le tri par sélection en pratique, en raison de moins de comparaisons et de bonnes performances sur des données presque triées, et est donc préféré en pratique, mais le tri par sélection utilise moins d’Écritures, et est donc utilisé lorsque les performances d’écriture sont un facteur limitant.

Insertion sortEdit

Main article: INSERTION sort

Insertion sort est un algorithme de tri simple qui est relativement efficace pour les petites listes et la plupart des listes triées, et est souvent utilisé dans le cadre d’algorithmes plus sophistiqués., Cela fonctionne en prenant les éléments de la liste un par un et en les insérant dans leur position correcte dans une nouvelle liste triée similaire à la façon dont nous mettons de l’argent dans notre portefeuille. Dans les tableaux, la nouvelle liste et les éléments restants peuvent partager l’espace du tableau, mais l’insertion est coûteuse, nécessitant de décaler tous les éléments suivants d’un. Shellsort (voir ci-dessous) est une variante du tri par insertion qui est plus efficace pour les listes plus grandes.

Sélection sortEdit

article Principal: Sélection du tri

tri de la Sélection est une comparaison de tri., Il a une complexité O (n2), ce qui le rend inefficace sur les grandes listes, et fonctionne généralement moins bien que le tri d’insertion similaire. Le tri par sélection est réputé pour sa simplicité et présente également des avantages en termes de performances par rapport à des algorithmes plus compliqués dans certaines situations.

l’algorithme trouve la valeur minimale, l’échange avec la valeur en première position et répète ces étapes pour le reste de la liste. Il ne fait pas plus de n swaps, et est donc utile lorsque l’échange est très coûteux.,

Efficient sortsEdit

les algorithmes de tri généraux pratiques sont presque toujours basés sur un algorithme de complexité temporelle moyenne (et généralement de complexité dans le pire des cas) O(N log n), dont les plus courants sont le tri par tas, le tri par fusion et le tri rapide. Chacun a des avantages et des inconvénients, Le plus important étant que la simple implémentation de merge sort utilise O(n) d’espace supplémentaire, et la simple implémentation de quicksort A O(n2) la complexité du pire des cas. Ces problèmes peuvent être résolus ou améliorés au prix d’un algorithme plus complexe.,

bien que ces algorithmes soient asymptotiquement efficaces sur des données aléatoires, pour une efficacité pratique sur des données réelles, diverses modifications sont utilisées. Tout d’abord, la surcharge de ces algorithmes devient importante sur les données plus petites, si souvent un algorithme hybride est utilisé, passant généralement au tri par insertion une fois que les données sont suffisamment petites. Deuxièmement, les algorithmes fonctionnent souvent mal sur des données déjà triées ou presque triées – celles-ci sont courantes dans les données du monde réel et peuvent être triées en temps O(n) par des algorithmes appropriés., Enfin, ils peuvent également être instables, et la stabilité est souvent une propriété souhaitable dans une sorte. Ainsi, des algorithmes plus sophistiqués sont souvent utilisés, tels que Timsort (basé sur le tri par fusion) ou introsort (basé sur quicksort, revenant au tri par tas).

Fusionner sortEdit

article Principal: Fusion de tri

Fusion de tri prend avantage de la facilité de fusion déjà listes triées dans une nouvelle liste triée. Il commence par comparer tous les deux éléments (c’est-à-dire 1 avec 2, puis 3 avec 4…) et les échanger si le premier doit venir après le second., Il fusionne ensuite chacune des listes résultantes de deux en listes de quatre, puis fusionne ces listes de quatre, et ainsi de suite; jusqu’à ce que deux listes soient fusionnées dans la liste triée finale. Parmi les algorithmes décrits ici, c’est le premier qui évolue bien vers de très grandes listes, car son temps d’exécution dans le pire des cas est O(N log n). Il est également facilement appliqué aux listes, pas seulement aux tableaux, car il ne nécessite qu’un accès séquentiel, pas un accès aléatoire. Cependant, il a une complexité D’espace O(n) supplémentaire et implique un grand nombre de copies dans des implémentations simples.,

le tri par Fusion a connu une popularité relativement récente pour les implémentations pratiques, en raison de son utilisation dans L’algorithme sophistiqué Timsort, qui est utilisé pour la routine de tri standard dans les langages de programmation Python et Java (à partir de JDK7). Merge sort lui-même est la routine standard dans Perl, entre autres, et a été utilisé en Java au moins depuis 2000 dans JDK1.3.

HeapsortEdit

Main article: Heapsort

Heapsort est une version beaucoup plus efficace du tri par sélection., Il fonctionne également en déterminant le plus grand (ou le plus petit) élément de la liste, en le plaçant à la fin (ou au début) de la liste, puis en continuant avec le reste de la liste, mais accomplit cette tâche efficacement en utilisant une structure de données appelée un tas, un type spécial d’arbre binaire. Une fois la liste de données transformée en tas, le nœud racine est garanti comme étant le plus grand (ou le plus petit) élément. Lorsqu’il est supprimé et placé à la fin de la liste, le tas est réarrangé de sorte que le plus grand élément restant se déplace vers la racine., En utilisant le tas, trouver le plus grand élément suivant prend O (log n) temps, au lieu de O(n) pour un balayage linéaire comme dans le tri de sélection simple. Cela permet à Heapsort de s’exécuter en temps O(N log n), et c’est aussi la pire complexité des cas.

QuicksortEdit

Main article: Quicksort

Quicksort est un algorithme de division et de conquête qui repose sur une opération de partition: pour partitionner un tableau, un élément appelé pivot est sélectionné. Tous les éléments plus petits que le pivot sont déplacés avant lui et tous les éléments plus grands sont déplacés après lui. Cela peut être fait efficacement en temps linéaire et sur place., Les sous-listes lesser et greater sont ensuite triées récursivement. Cela donne une complexité temporelle moyenne de O (N log n), avec une faible surcharge, et c’est donc un algorithme populaire. Les implémentations efficaces de quicksort (avec partitionnement sur place) sont généralement des triages instables et quelque peu complexes, mais font partie des algorithmes de tri les plus rapides dans la pratique. Avec son utilisation modeste de L’Espace o(log n), quicksort est l’un des algorithmes de tri les plus populaires et est disponible dans de nombreuses bibliothèques de programmation standard.,

la mise en garde importante à propos de quicksort est que sa performance dans le pire des cas est O(n2); bien que cela soit rare, dans les implémentations naïves (En choisissant le premier ou le dernier élément comme pivot), cela se produit pour les données triées, ce qui est un cas courant. Le problème le plus complexe dans quicksort est donc de choisir un bon élément de pivot, car de mauvais choix de pivots peuvent entraîner des performances o(n2) drastiquement plus lentes, mais un bon choix de pivots donne des performances O(N log n), ce qui est asymptotiquement optimal. Par exemple, si à chaque étape la médiane est choisie comme pivot, l’algorithme fonctionne en O(N log n)., Trouver la médiane, par exemple par l’algorithme de sélection de la médiane des médianes, est cependant une opération O(n) sur des listes non triées et nécessite donc une surcharge importante avec le tri. En pratique, le choix d’un pivot aléatoire donne presque certainement des performances O(N log n).

ShellsortEdit

un tri Shell, différent du tri à bulles en ce qu’il déplace les éléments vers de nombreuses positions d’échange.

article Principal: tri de Shell

Shellsort a été inventé par Donald Shell en 1959., Il améliore le tri par insertion en déplaçant les éléments hors d’ordre de plus d’une position à la fois. Le concept derrière Shellsort est que le tri par insertion s’effectue dans le temps O ( k n ) {\displaystyle O(kn)}, où k est la plus grande distance entre deux éléments déplacés. Cela signifie que généralement, ils fonctionnent en O (n2), mais pour les données qui sont principalement triées, avec seulement quelques éléments déplacés, ils fonctionnent plus rapidement. Ainsi, en triant d’abord les éléments loin et en réduisant progressivement l’écart entre les éléments à trier, le tri final calcule beaucoup plus rapidement., Une implémentation peut être décrite comme l’organisation de la séquence de données dans un tableau bidimensionnel, puis le tri des colonnes du tableau à l’aide du tri par insertion.

la complexité temporelle dans le pire des cas de Shellsort est un problème ouvert et dépend de la séquence d’écart utilisée, avec des complexités connues allant de O(n2) à O(n4/3) et Θ(N log2 n)., Ceci, combiné au fait que Shellsort est en place, n’a besoin que d’une quantité relativement faible de code et ne nécessite pas l’utilisation de la pile d’appels, le rend utile dans les situations où la mémoire est à un prix élevé, comme dans les systèmes embarqués et les noyaux de système d’exploitation.

tri à Bulles et variantsEdit

Cette section ne cite pas les sources. Veuillez aider à améliorer cette section en ajoutant des citations à des sources fiables. Le matériel non approvisionné peut être contesté et retiré., (Mai 2019) (découvrez comment et quand Supprimer ce message de modèle)

Le tri à bulles, et des variantes telles que le tri shell et le tri cocktail, sont des algorithmes de tri simples et très inefficaces. Ils sont fréquemment vus dans les textes d’introduction en raison de la facilité d’analyse, mais ils sont rarement utilisés dans la pratique.

Bubble sortEdit

un tri à bulles, un algorithme de tri qui parcourt en continu une liste, en échangeant des éléments jusqu’à ce qu’ils apparaissent dans le bon ordre.,

article Principal: tri à Bulles

tri à Bulles est un simple algorithme de tri. L’algorithme commence au début de l’ensemble de données. Il compare les deux premiers éléments, et si le premier est supérieur au second, il swaps eux. Il continue de le faire pour chaque paire d’éléments adjacents à la fin de l’ensemble de données. Il recommence ensuite avec les deux premiers éléments, en répétant jusqu’à ce qu’aucun échange n’ait eu lieu lors de la dernière passe. Le temps moyen et les performances dans le pire des cas de cet algorithme sont O(n2), il est donc rarement utilisé pour trier de grands ensembles de données non ordonnés., Le tri par bulles peut être utilisé pour trier un petit nombre d’éléments (où son inefficacité asymptotique n’est pas une pénalité élevée). Le tri par bulles peut également être utilisé efficacement sur une liste de n’importe quelle longueur qui est presque triée (c’est-à-dire que les éléments ne sont pas significativement hors de propos). Par exemple, si un certain nombre d’éléments ne sont pas à leur place par une seule position (par exemple 0123546789 et 1032547698), l’échange de tri à bulles les mettra en ordre lors de la première passe, la deuxième passe trouvera tous les éléments dans l’ordre, donc le tri ne prendra que 2n de temps.,

Comb sortEdit

Article principal: Comb sort

Comb sort est un algorithme de tri relativement simple basé sur le tri à bulles et conçu à l’origine par Włodzimierz Dobosiewicz en 1980. Il a ensuite été redécouvert et popularisé par Stephen Lacey et Richard Box avec un article du magazine Byte publié en avril 1991. L’idée de base est d’éliminer les tortues, ou les petites valeurs près de la fin de la liste, car dans un tri à bulles, elles ralentissent énormément le tri., (Lapins, grandes valeurs autour du début de la liste, ne posent pas de problème dans le tri à bulles) il accomplit cela en échangeant initialement des éléments qui sont à une certaine distance les uns des autres dans le tableau, plutôt que d’échanger uniquement des éléments s’ils sont adjacents les uns aux autres, puis en réduisant la distance choisie jusqu’à ce Ainsi, si Shellsort peut être considéré comme une version généralisée du tri par insertion qui échange des éléments espacés d’une certaine distance les uns des autres, le tri par peigne peut être considéré comme la même généralisation appliquée au tri par bulle.,

distribution sortEdit

Voir aussi: tri externe

le tri de Distribution fait référence à tout algorithme de tri où les données sont distribuées de leur entrée à plusieurs structures intermédiaires qui sont ensuite rassemblées et placées sur la sortie. Par exemple, le tri par seau et flashsort sont des algorithmes de tri basés sur la distribution. Les algorithmes de tri de Distribution peuvent être utilisés sur un seul processeur, ou ils peuvent être un algorithme distribué, où les sous-ensembles individuels sont triés séparément sur différents processeurs, puis combinés., Cela permet un tri externe des données trop volumineuses pour tenir dans la mémoire d’un seul ordinateur.

Counting sortEdit

Main article: Counting sort

Counting sort est applicable lorsque chaque entrée est connue pour appartenir à un ensemble particulier de possibilités. L’algorithme s’exécute en temps O(|S| + n) et en mémoire o(|s|) où n est la longueur de l’entrée. Cela fonctionne en créant un tableau entier de taille / s / et en utilisant le ith bin pour compter les occurrences du ith membre de S dans l’entrée. Chaque entrée est ensuite comptée en incrémentant la valeur de son bin correspondant., Ensuite, le tableau de comptage est bouclé pour organiser toutes les entrées dans l’ordre. Cet algorithme de tri ne peut souvent pas être utilisé car S doit être raisonnablement petit pour que l’algorithme soit efficace, mais il est extrêmement rapide et démontre un grand comportement asymptotique à mesure que n augmente. Il peut également être modifié pour fournir un comportement stable.

Bucket sortEdit

Main article: Bucket sort

Bucket sort est un algorithme de tri par division qui généralise le tri par comptage en partitionnant un tableau en un nombre fini de buckets., Chaque compartiment est ensuite trié individuellement, soit en utilisant un algorithme de tri différent, soit en appliquant récursivement l’algorithme de tri de compartiment.

un tri par compartiments fonctionne mieux lorsque les éléments de l’ensemble de données sont répartis uniformément dans tous les compartiments.

Radix sortEdit

article Principal: Radix trier

tri Radix est un algorithme qui trie les nombres par le traitement des chiffres individuels. n nombres composés de k chiffres chacun sont triés en temps O · n * k)., Radix sort peut traiter les chiffres de chaque nombre à partir du chiffre le moins significatif (LSD) ou à partir du chiffre le plus significatif (MSD). L’algorithme LSD trie d’abord la liste par le chiffre le moins significatif tout en préservant leur ordre relatif à l’aide d’un tri stable. Ensuite, il les trie par le chiffre suivant, et ainsi de suite du moins significatif au plus significatif, se terminant par une liste triée. Alors que le tri radix LSD nécessite l’utilisation d’un tri stable, L’algorithme de tri radix MSD ne le fait pas (sauf si un tri stable est souhaité). Le tri Radix MSD en place n’est pas stable., Il est courant que l’algorithme de tri de comptage soit utilisé en interne par le tri radix. Une approche de tri hybride, telle que l’utilisation du tri par insertion pour les petits bacs, améliore considérablement les performances du tri radix.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *