API , Quicksort'un sunmadığı istikrarlı bir sıralamayı garanti eder . Ancak, ilkel değerleri doğal sıralarına göre sıralarken, ilkel değerlerin kimliği olmadığından bir fark görmezsiniz. Bu nedenle, Quicksort ilkel diziler için kullanılabilir ve daha verimli olduğu düşünüldüğünde kullanılacaktır¹.
Nesneler için, equals
uygulanmalarına veya sağlananlara göre eşit kabul edilen farklı kimliğe sahip nesnelerin Comparator
sırasını değiştirdiğini fark edebilirsiniz. Bu nedenle, Quicksort bir seçenek değildir. Dolayısıyla, MergeSort'un bir çeşidi kullanılır, mevcut Java sürümleri TimSort'u kullanır . Bu her ikisi için de geçerlidir Arrays.sort
ve Collections.sort
Java 8 ile birlikte, List
kendisi sıralama algoritmalarını geçersiz kılabilir.
¹ Quicksort'un verimlilik avantajı, yerinde yapıldığında daha az belleğe ihtiyaç duymasıdır . Ancak dramatik bir en kötü durum performansına sahiptir ve TimSort'un yaptığı gibi bir dizideki önceden sıralanmış verilerin çalıştırılmasından yararlanamaz .
Bu nedenle, artık yanıltıcı olarak adlandırılan sınıfta kalırken, sıralama algoritmaları sürümden sürüme yeniden çalışıldı DualPivotQuicksort
. Ayrıca, dokümantasyon uyuşmadı, bu da genel olarak, gerekli olmadığında bir spesifikasyonda dahili olarak kullanılan bir algoritmayı adlandırmanın kötü bir fikir olduğunu gösteriyor.
Mevcut durum (Java 8 ila Java 11 dahil) aşağıdaki gibidir:
- Genel olarak, ilkel diziler için sıralama yöntemleri, yalnızca belirli koşullar altında Quicksort'u kullanır . Daha büyük diziler için, TimSort'un yaptığı gibi, önce önceden sıralanmış veri çalıştırmalarını belirlemeye çalışacaklar ve çalıştırma sayısı belirli bir eşiği aşmadığında bunları birleştirecekler. Aksi takdirde, Quicksort'a geri dönerler , ancak küçük aralıklar için Insertion sıralamasına geri dönecek bir uygulama ile , bu sadece küçük dizileri değil aynı zamanda hızlı sıralamanın özyinelemesini de etkiler.
sort(char[],…)
ve uzunluğu belirli bir eşiği aşan diziler için Sayma sıralamasınısort(short[],…)
kullanmak için başka bir özel durum ekleyin
- Aynı şekilde, Sayma sıralaması
sort(byte[],…)
kullanacak , ancak çok daha küçük bir eşikle, hiçbir zaman Quicksort kullanmadığı için dokümantasyonla en büyük kontrastı yaratıyor . Yalnızca küçük diziler için Ekleme sıralaması , aksi halde Sayma sıralaması kullanır .sort(byte[],…)