API menjamin pengurutan stabil yang tidak ditawarkan Quicksort . Namun, saat mengurutkan nilai primitif berdasarkan urutan aslinya, Anda tidak akan melihat perbedaan karena nilai primitif tidak memiliki identitas. Oleh karena itu, Quicksort dapat digunakan untuk array primitif dan akan digunakan jika dianggap lebih efisien¹.
Untuk objek yang mungkin Anda perhatikan, ketika objek dengan identitas berbeda yang dianggap sama menurut equals
implementasinya atau yang disediakan Comparator
mengubah urutannya. Oleh karena itu, Quicksort bukanlah suatu pilihan. Jadi varian MergeSort digunakan, versi Java saat ini menggunakan TimSort . Ini berlaku untuk keduanya, Arrays.sort
dan Collections.sort
, meskipun dengan Java 8, List
algoritma itu sendiri dapat menimpa algoritme pengurutan.
¹ Keuntungan efisiensi Quicksort adalah membutuhkan lebih sedikit memori saat dilakukan di tempat. Tetapi ini memiliki kinerja kasus terburuk yang dramatis dan tidak dapat mengeksploitasi proses data yang telah diurutkan sebelumnya dalam array, yang dilakukan oleh TimSort .
Oleh karena itu, algoritme pengurutan dikerjakan ulang dari versi ke versi, sambil tetap berada di kelas dengan nama yang sekarang menyesatkan DualPivotQuicksort
. Selain itu, dokumentasi tidak sesuai, yang menunjukkan, bahwa secara umum adalah ide yang buruk, untuk menyebutkan algoritme yang digunakan secara internal dalam spesifikasi, jika tidak diperlukan.
Situasi saat ini (termasuk Java 8 hingga Java 11) adalah sebagai berikut:
- Umumnya, metode pengurutan untuk array primitif hanya akan menggunakan Quicksort dalam keadaan tertentu. Untuk array yang lebih besar, mereka akan mencoba mengidentifikasi proses data yang telah diurutkan terlebih dahulu, seperti yang dilakukan TimSort , dan akan menggabungkannya ketika jumlah proses tidak melebihi ambang tertentu. Jika tidak, mereka akan kembali ke Quicksort , tetapi dengan implementasi yang akan kembali ke jenis Penyisipan untuk rentang kecil, yang tidak hanya memengaruhi larik kecil, tetapi juga rekursi pengurutan cepat.
sort(char[],…)
dan sort(short[],…)
tambahkan kasus khusus lainnya, untuk menggunakan Sortir penghitungan untuk array yang panjangnya melebihi ambang tertentu
- Demikian juga,
sort(byte[],…)
akan menggunakan jenis Penghitungan , tetapi dengan ambang yang jauh lebih kecil, yang menciptakan kontras terbesar dengan dokumentasi, karena sort(byte[],…)
tidak pernah menggunakan Quicksort. Ini hanya menggunakan semacam penyisipan untuk larik kecil dan jenis Penghitungan sebaliknya.