API gwarantuje stabilne sortowanie, którego nie oferuje Quicksort . Jednak podczas sortowania wartości pierwotnych według ich naturalnej kolejności nie zauważysz różnicy, ponieważ wartości pierwotne nie mają tożsamości. Dlatego też Quicksort może być używany dla tablic pierwotnych i będzie używany, gdy zostanie uznany za bardziej wydajny¹ .
W przypadku obiektów można zauważyć, że obiekty o różnej tożsamości, które są uważane za równe w zależności od ich equals
wykonania lub dostarczonej Comparator
zmiany, zmieniają kolejność. Dlatego Quicksort nie wchodzi w grę. Tak więc używany jest wariant MergeSort , obecne wersje Java używają TimSort . Dotyczy to obu Arrays.sort
i Collections.sort
chociaż w Javie 8 List
samo w sobie może przesłonić algorytmy sortowania.
¹ Zaletą wydajności Quicksort jest to, że wymaga mniej pamięci, gdy jest wykonywana na miejscu. Ale ma dramatyczną wydajność w najgorszym przypadku i nie może wykorzystywać serii wstępnie posortowanych danych w tablicy, co robi TimSort .
Dlatego algorytmy sortowania zostały przerobione z wersji na wersję, pozostając w myląco nazwanej klasie DualPivotQuicksort
. Ponadto dokumentacja nie nadrobiła zaległości, co pokazuje, że generalnie złym pomysłem jest nazwanie w specyfikacji algorytmu używanego wewnętrznie, gdy nie jest to konieczne.
Obecna sytuacja (w tym Java 8 do Java 11) przedstawia się następująco:
- Ogólnie rzecz biorąc, metody sortowania tablic prymitywnych używają funkcji Quicksort tylko w określonych okolicznościach. W przypadku większych tablic będą najpierw próbować zidentyfikować serie wstępnie posortowanych danych, tak jak robi to TimSort , i scalą je, gdy liczba przebiegów nie przekroczy określonego progu. W przeciwnym razie powrócą do Quicksort , ale z implementacją, która powróci do sortowania przez wstawianie dla małych zakresów, co ma wpływ nie tylko na małe tablice, ale także na rekursję szybkiego sortowania.
sort(char[],…)
i sort(short[],…)
dodaj kolejny przypadek specjalny, aby użyć sortowania zliczającego dla tablic, których długość przekracza określony próg
- Podobnie,
sort(byte[],…)
użyje sortowania zliczającego , ale ze znacznie mniejszym progiem, co tworzy największy kontrast w stosunku do dokumentacji, ponieważ sort(byte[],…)
nigdy nie używa Quicksort. Używa sortowania przez wstawianie tylko dla małych tablic i sortowania zliczania w przeciwnym razie.