L'API garantisce uno smistamento stabile che Quicksort non offre. Tuttavia, quando si ordinano i valori primitivi in base al loro ordine naturale, non si noterà alcuna differenza poiché i valori primitivi non hanno identità. Pertanto, Quicksort può essere utilizzato per array primitivi e verrà utilizzato quando sarà considerato più efficiente¹.
Per gli oggetti che potresti notare, quando oggetti con identità diversa che sono ritenuti uguali in base alla loro equals
implementazione o a quanto fornito Comparator
cambiano il loro ordine. Pertanto, Quicksort non è un'opzione. Quindi viene utilizzata una variante di MergeSort , le versioni Java correnti utilizzano TimSort . Questo vale per entrambi Arrays.sort
e Collections.sort
, sebbene con Java 8, lo List
stesso potrebbe sovrascrivere gli algoritmi di ordinamento.
¹ Il vantaggio in termini di efficienza di Quicksort è la necessità di una minore quantità di memoria quando viene eseguito sul posto. Ma ha prestazioni drammatiche nel caso peggiore e non può sfruttare esecuzioni di dati preordinati in un array, cosa che fa TimSort .
Pertanto, gli algoritmi di ordinamento sono stati rielaborati da versione a versione, pur rimanendo nella classe ora chiamata in modo fuorviante DualPivotQuicksort
. Inoltre, la documentazione non ha recuperato, il che mostra che in generale è una cattiva idea nominare un algoritmo utilizzato internamente in una specifica, quando non è necessario.
La situazione attuale (inclusi Java 8 e Java 11) è la seguente:
- In genere, i metodi di ordinamento per gli array primitivi utilizzeranno Quicksort solo in determinate circostanze. Per array più grandi, cercheranno di identificare prima le esecuzioni di dati preordinati, come fa TimSort , e le uniranno quando il numero di esecuzioni non supera una certa soglia. Altrimenti torneranno a Quicksort , ma con un'implementazione che ricadrà sull'ordinamento di inserimento per piccoli intervalli, che non riguarda solo i piccoli array, ma anche la ricorsione dell'ordinamento rapido.
sort(char[],…)
e sort(short[],…)
aggiungere un altro caso speciale, per utilizzare l' ordinamento conteggio per array la cui lunghezza supera una certa soglia
- Allo stesso modo,
sort(byte[],…)
utilizzerà l' ordinamento conteggio , ma con una soglia molto più piccola, che crea il maggiore contrasto con la documentazione, poiché sort(byte[],…)
non utilizza mai Quicksort. Utilizza solo l' ordinamento di inserimento per piccoli array e l' ordinamento conteggio in caso contrario.