Tri par comparaison

From Wikipedia, the free encyclopedia

Le tri d'un ensemble de poids non étiquetés par poids en utilisant uniquement une balance nécessite un algorithme de tri par comparaison.

Un tri par comparaison est un type d'algorithme de tri qui lit uniquement les éléments de la liste via une seule opération de comparaison abstraite (souvent un opérateur "inférieur ou égal à" ou une comparaison trilatérale) qui détermine lequel des deux éléments doit apparaître en premier dans le liste triée finale. La seule exigence est que l'opérateur soit une relation de préordre total, avec:

  1. si ab et bc alors ac (transitivité)
  2. pour tout a et b, ab ou ba (connexité).

Il est possible que ab et ba; dans ce cas, l'un ou l'autre peut apparaître en premier dans la liste triée. Dans un tri stable, l’ordonnancement initial détermine l'ordre des éléments triés.

Une métaphore pour réfléchir aux types de comparaison est que quelqu'un possède un ensemble de poids non étiquetés et une balance. Leur objectif est d'aligner les poids en fonction de leur poids sans aucune information sauf celle obtenue en plaçant deux poids sur la balance et en voyant lequel est le plus lourd (ou s'ils pèsent le même poids).

Tri rapide en action sur une liste de nombres. Les lignes horizontales sont des valeurs pivots.

Parmi les types de comparaison les plus connus :

Bornes et avantages des différentes techniques de tri

Il existe des limites fondamentales aux performances des tris par comparaison. Un tri par comparaison doit avoir Ω (n log n) comparaisons en moyenne[1], qui est connue sous le nom de temps linéarithmique. C’est une conséquence du peu d’informations disponibles grâce aux seules comparaisons – ou, pour le dire autrement, de la vague structure algébrique d’ensembles totalement ordonnés. En ce sens, le tri par fusion, le tri par tas et Introsort sont optimaux en termes de nombre de comparaisons qu'ils doivent effectuer, bien que cette métrique néglige les autres opérations. Les tris sans comparaison (tels que les exemples on trouve ci-dessous) peuvent atteindre des performances O(n) en utilisant des opérations autres que les comparaisons, leur permettant de contourner cette borne inférieure (en supposant que les éléments sont de taille constante).

Un algorithme de tri comparatif peut s'exécuter plus rapidement sur certaines listes ; de nombreux tris adaptatifs tels que le tri par insertion s'exécutent en un temps O(n) sur une liste déjà triée ou presque triée. La borne inférieure Ω (n log n) s'applique uniquement au cas dans lequel la liste peut être dans n'importe quel ordre.

Les mesures réelles de la complexité de tri devront prendre en compte la capacité de certains algorithmes à utiliser de manière optimale la mémoire vive de l'ordinateur, ou l'algorithme peut bénéficier de méthodes de tri dans lesquelles les données triées commencent à apparaître à l'utilisateur avant la fin du tri par opposition aux méthodes de tri où aucune sortie n'est disponible tant que la liste entière n'est pas triée.

Malgré ces limitations, les tris par comparaison offrent le contrôle de la fonction de comparaison qui permet de trier de nombreux types de données différents et de contrôler finement la manière dont la liste est triée. Par exemple, inverser le résultat de la fonction de comparaison permet de trier la liste à l'envers ; et on peut trier une liste de tuples par ordre lexicographique en créant simplement une fonction de comparaison qui compare chaque partie :

function tupleCompare((lefta, leftb, leftc), (righta, rightb, rightc))
    if lefta ≠ righta
        return compare(lefta, righta)
    else if leftb ≠ rightb
        return compare(leftb, rightb)
    else
        return compare(leftc, rightc)

Les tris par comparaison s'adaptent généralement plus facilement aux ordres complexes tels que l'ordre des nombres à virgule flottante. Aussi, dès qu’une fonction de comparaison est fixée, n’importe quel tri par comparaison peut être utilisé; les tris sans comparaison nécessitent généralement des versions adaptées pour chaque type de données.

Cette flexibilité, ainsi que l'efficacité des algorithmes de tri par comparaison ci-dessus sur les ordinateurs modernes, ont conduit à la popularité des tris par comparaison dans la plupart des travaux pratiques.

Alternatives

Certains problèmes de tri admettent une solution strictement plus rapide que la borne Ω(n log n) du tri par comparaison grâce à l'utilisation des tris sans comparaison ; un exemple est le tri de nombres entiers, où toutes les clés sont des entiers. Lorsque les clés forment une petite plage (en comparaison avec n), le tri comptage est un exemple d'algorithme qui s'exécute en temps linéaire. D'autres algorithmes de tri d'entiers, tels que le tri par base, ne sont pas asymptotiquement plus rapides que le tri par comparaison, mais peuvent être plus rapides en pratique.

Le problème du tri de paires de nombres par leur somme n'est pas non plus soumis à la borne Ω(n² log n); l'algorithme le plus connu prend toujours un temps O(n² log n), mais seulement O(n²) comparaisons.

Nombre de comparaisons nécessaires pour trier une liste

Références

Bibliographie

Related Articles

Wikiwand AI