A API garante uma classificação estável que Quicksort não oferece. No entanto, ao classificar os valores primitivos por sua ordem natural, você não notará a diferença, pois os valores primitivos não têm identidade. Portanto, Quicksort pode ser usado para arrays primitivos e será usado quando for considerado mais eficiente¹.
Para objetos, você pode notar, quando objetos com identidade diferente que são considerados iguais de acordo com sua equals
implementação ou o fornecido Comparator
mudam sua ordem. Portanto, Quicksort não é uma opção. Portanto, uma variante de MergeSort é usada, as versões atuais do Java usam TimSort . Isso se aplica a ambos Arrays.sort
e Collections.sort
, embora com Java 8, o List
próprio pode substituir os algoritmos de classificação.
¹ A vantagem de eficiência do Quicksort é a necessidade de menos memória quando feito no local. Mas tem um desempenho dramático no pior caso e não pode explorar execuções de dados pré-classificados em um array, o que o TimSort faz.
Portanto, os algoritmos de classificação foram retrabalhados de versão para versão, enquanto permaneciam na classe agora erroneamente nomeada DualPivotQuicksort
. Além disso, a documentação não alcançou o atraso, o que mostra que é uma má ideia em geral, nomear um algoritmo usado internamente em uma especificação, quando não necessário.
A situação atual (incluindo Java 8 a Java 11) é a seguinte:
- Geralmente, os métodos de classificação para matrizes primitivas usarão Quicksort somente em certas circunstâncias. Para matrizes maiores, eles tentarão identificar as execuções de dados pré-classificados primeiro, como o TimSort faz, e os mesclarão quando o número de execuções não exceder um determinado limite. Caso contrário, eles recorrerão ao Quicksort , mas com uma implementação que retornará à classificação por inserção para intervalos pequenos, o que não afeta apenas pequenos arrays, mas também a recursão da classificação rápida.
sort(char[],…)
e sort(short[],…)
adicionar outro caso especial, para usar a classificação por contagem para matrizes cujo comprimento excede um certo limite
- Da mesma forma,
sort(byte[],…)
usará a classificação por contagem , mas com um limite muito menor, o que cria o maior contraste com a documentação, já que sort(byte[],…)
nunca usa Quicksort. Ele só usa a classificação por inserção para pequenos arrays e, caso contrário, a classificação por contagem .