API гарантирует стабильную сортировку, чего не предлагает Quicksort . Однако при сортировке примитивных значений по их естественному порядку вы не заметите разницы, поскольку примитивные значения не имеют идентичности. Следовательно, быстрая сортировка может использоваться для примитивных массивов и будет использоваться, когда будет сочтена более эффективной¹.
Для объектов вы можете заметить, когда объекты с разными идентификаторами, которые считаются равными в зависимости от их equals
реализации или предоставленного, Comparator
изменяют свой порядок. Таким образом, Quicksort не вариант. Таким образом, используется вариант MergeSort , текущие версии Java используют TimSort . Это применимо к обоим, Arrays.sort
и Collections.sort
, хотя в Java 8, List
сам по себе может переопределить алгоритмы сортировки.
¹ Преимущество быстрой сортировки в эффективности заключается в том, что при выполнении на месте требуется меньше памяти. Но он имеет потрясающую производительность в худшем случае и не может использовать прогоны предварительно отсортированных данных в массиве, что делает TimSort .
Поэтому алгоритмы сортировки переделывались от версии к версии, оставаясь при этом в классе, который теперь неправильно назван DualPivotQuicksort
. Кроме того, документация не обновилась, что показывает, что в целом плохая идея - указывать в спецификации внутренний алгоритм, когда в этом нет необходимости.
Текущая ситуация (включая Java 8 - Java 11) выглядит следующим образом:
- Как правило, методы сортировки примитивных массивов используют быструю сортировку только при определенных обстоятельствах. Для больших массивов они сначала попытаются идентифицировать прогоны предварительно отсортированных данных, как это делает TimSort , и объединят их, когда количество прогонов не превысит определенный порог. В противном случае они вернутся к быстрой сортировке , но с реализацией, которая вернется к сортировке вставкой для небольших диапазонов, что не только влияет на небольшие массивы, но и на рекурсию быстрой сортировки.
sort(char[],…)
и sort(short[],…)
добавьте еще один особый случай, чтобы использовать сортировку с подсчетом для массивов, длина которых превышает определенный порог
- Точно так же
sort(byte[],…)
будет использоваться сортировка подсчетом , но с гораздо меньшим порогом, что создает самый большой контраст с документацией, поскольку sort(byte[],…)
никогда не использует быструю сортировку. Он использует только сортировку вставкой для небольших массивов и сортировку подсчетом в противном случае.