L'API garantit un tri stable que Quicksort n'offre pas. Cependant, lors du tri des valeurs primitives selon leur ordre naturel, vous ne remarquerez aucune différence car les valeurs primitives n'ont pas d'identité. Par conséquent, Quicksort peut être utilisé pour les tableaux primitifs et sera utilisé lorsqu'il sera considéré comme plus efficace¹.
Pour les objets, vous remarquerez peut-être, lorsque des objets avec une identité différente qui sont jugés égaux en fonction de leur equals
implémentation ou du fourni Comparator
changent leur ordre. Par conséquent, Quicksort n'est pas une option. Donc, une variante de MergeSort est utilisée, les versions Java actuelles utilisent TimSort . Cela s'applique aux deux Arrays.sort
et Collections.sort
, bien qu'avec Java 8, le List
lui-même peut remplacer les algorithmes de tri.
¹ L'avantage d'efficacité de Quicksort est qu'il nécessite moins de mémoire lorsqu'il est effectué sur place. Mais il a des performances dramatiques dans le pire des cas et ne peut pas exploiter des séries de données pré-triées dans un tableau, ce que fait TimSort .
Par conséquent, les algorithmes de tri ont été retravaillés de version en version, tout en restant dans la classe désormais mal nommée DualPivotQuicksort
. De plus, la documentation n'a pas rattrapé son retard, ce qui montre que c'est une mauvaise idée en général de nommer un algorithme utilisé en interne dans une spécification, quand ce n'est pas nécessaire.
La situation actuelle (y compris Java 8 à Java 11) est la suivante:
- En règle générale, les méthodes de tri des tableaux primitifs n'utilisent Quicksort que dans certaines circonstances. Pour les tableaux plus grands, ils essaieront d'abord d'identifier les séries de données pré-triées, comme le fait TimSort , et les fusionneront lorsque le nombre d'exécutions ne dépasse pas un certain seuil. Sinon, ils reviendront à Quicksort , mais avec une implémentation qui reviendra au tri par insertion pour les petites plages, ce qui n'affecte pas seulement les petits tableaux, mais également la récursivité du tri rapide.
sort(char[],…)
et sort(short[],…)
ajoutez un autre cas particulier, pour utiliser le tri par comptage pour les tableaux dont la longueur dépasse un certain seuil
- De même,
sort(byte[],…)
utilisera le tri par comptage , mais avec un seuil beaucoup plus petit, ce qui crée le plus grand contraste avec la documentation, car il sort(byte[],…)
n'utilise jamais Quicksort. Il utilise uniquement le tri par insertion pour les petits tableaux et le tri par comptage dans le cas contraire.