La API garantiza una clasificación estable que Quicksort no ofrece. Sin embargo, al ordenar los valores primitivos por su orden natural, no notará una diferencia ya que los valores primitivos no tienen identidad. Por lo tanto, Quicksort se puede usar para matrices primitivas y se usará cuando se considere más eficiente¹.
En el caso de los objetos, puede observar cuando los objetos con una identidad diferente que se consideran iguales según su equals
implementación o la proporcionada Comparator
cambian su orden. Por lo tanto, Quicksort no es una opción. Entonces se usa una variante de MergeSort , las versiones actuales de Java usan TimSort . Esto se aplica a ambos Arrays.sort
y Collections.sort
, aunque con Java 8, el List
mismo puede anular los algoritmos de ordenación.
¹ La ventaja de eficiencia de Quicksort es que necesita menos memoria cuando se realiza en el lugar. Pero tiene un rendimiento dramático en el peor de los casos y no puede explotar las ejecuciones de datos preordenados en una matriz, lo que hace TimSort .
Por lo tanto, los algoritmos de clasificación se modificaron de una versión a otra, mientras permanecían en la clase que ahora tiene un nombre engañoso DualPivotQuicksort
. Además, la documentación no se puso al día, lo que muestra que, en general, es una mala idea nombrar un algoritmo utilizado internamente en una especificación, cuando no es necesario.
La situación actual (incluyendo Java 8 a Java 11) es la siguiente:
- Generalmente, los métodos de clasificación para matrices primitivas usarán Quicksort solo bajo ciertas circunstancias. Para arreglos más grandes, intentarán identificar primero las ejecuciones de datos preordenados , como lo hace TimSort , y los fusionará cuando la cantidad de ejecuciones no supere un cierto umbral. De lo contrario, recurrirán al ordenamiento rápido , pero con una implementación que recurrirá al ordenamiento por inserción para rangos pequeños, lo que no solo afecta a las matrices pequeñas, sino también a la recursividad del ordenamiento rápido.
sort(char[],…)
y sort(short[],…)
agregue otro caso especial, para usar la clasificación de conteo para matrices cuya longitud exceda un cierto umbral
- Del mismo modo,
sort(byte[],…)
usará la ordenación por conteo , pero con un umbral mucho más pequeño, lo que crea el mayor contraste con la documentación, ya que sort(byte[],…)
nunca usa ordenación rápida. Solo usa la ordenación por inserción para matrices pequeñas y la ordenación por conteo en caso contrario.