API гарантує стабільне сортування, яке Quicksort не пропонує. Однак при сортуванні примітивних значень за їх природним порядком ви не помітите різниці, оскільки примітивні значення не мають ідентичності. Тому Quicksort може використовуватися для примітивних масивів і буде використовуватися, коли він вважатиметься більш ефективним¹.
Щодо об’єктів, які ви можете помітити, коли об’єкти з різною ідентичністю, які вважаються рівними відповідно до їх equals
реалізації або передбаченого, Comparator
змінюють їх порядок. Тому Quicksort не є варіантом. Отже, використовується варіант MergeSort , поточні версії Java використовують TimSort . Це стосується обох, Arrays.sort
і Collections.sort
, хоча в Java 8, List
сам може замінити алгоритми сортування.
Advantage Перевага в ефективності Quicksort вимагає меншої пам’яті при роботі на місці. Але він має найгіршу продуктивність і не може використовувати прогони попередньо відсортованих даних у масиві, що робить TimSort .
Тому алгоритми сортування перероблялись з версії на версію, залишаючись у теперішньому оманливому класі DualPivotQuicksort
. Крім того, документація не наздогнала, що показує, що взагалі погана ідея називати внутрішньо використовуваний алгоритм у специфікації, коли це не потрібно.
Поточна ситуація (включаючи Java 8 до Java 11) така:
- Як правило, методи сортування для примітивних масивів використовуватимуть Quicksort лише за певних обставин. Для більших масивів вони намагатимуться спочатку ідентифікувати прогони попередньо відсортованих даних, як це робить TimSort , і об’єднуватимуть їх, коли кількість прогонів не перевищує певного порогу. В іншому випадку вони повернуться до Quicksort , але з реалізацією, яка повернеться до Insertion sort для малих діапазонів, що впливає не тільки на малі масиви, але і на рекурсію швидкого сортування.
sort(char[],…)
та sort(short[],…)
додайте ще один особливий випадок, щоб використовувати сортування підрахунку для масивів, довжина яких перевищує певний поріг
- Аналогічним чином,
sort(byte[],…)
використовуватиметься Counting sort , але з набагато меншим порогом, що створює найбільший контраст з документацією, оскільки sort(byte[],…)
ніколи не використовує Quicksort. Він використовує сортування вставки лише для малих масивів та сортування підрахунку в іншому випадку.