Как вызвать java встроенный TimSort для массива примитивных типов данных - PullRequest
1 голос
/ 16 марта 2020

В java, метод Arrays.sort имеет две перегрузки (которые меня интересуют в этом посте), одна для примитивных типов, а другая для ссылочных типов. Они используют разные алгоритмы сортировки.

Как я могу использовать алгоритм, используемый для ссылочных типов, для сортировки примитивных типов (без преобразования их в ссылочные типы и без использования списков)

Метод Arrays.sort(int[]) использует Dual-Pivot Быстрая сортировка .

Метод Arrays.sort(Object[]) использует TimSort .

Если я есть int[] array = { /* some values here */ };, как я могу отсортировать его с помощью TimSort? (Я знаю, что при использовании Integer[] array = { /* some values here */ }; будет использоваться TimSort, но я не хочу этого из-за накладных расходов, связанных с использованием Objects вместо примитивных данных, и, возможно, позже будут происходить некоторый бокс и распаковка)

Или это неэффективно для использовать TimSort для примитивных данных?

Я нашел класс для TimSort java .util.TimSort , но не смог получить к нему доступ в своих кодах.

причина этого вопроса в том, что у Quicksort наихудший случай O(n^2), и я столкнулся с массивом, который использовал этот случай. В то время как TimSort имеет худший случай (n log(n)) и лучший случай O(n)

ОБНОВЛЕНИЕ:

Я на самом деле заинтересован просто иметь встроенный метод для TimSort, он не должно быть Arrays.sort. Если есть какой-либо другой встроенный метод для сортировки примитивных типов данных с использованием TimSort, то это полностью приветствуется.

1 Ответ

0 голосов
/ 16 марта 2020

java встроенные TimSort и ComparableTimSort не работают с массивами примитивных типов данных, только метод сортировки ожидает массив объектов

static void sort(Object[] a, int lo, int hi, Object[] work, int workBase, int workLen);

В то время как DualPivotQuicksort имеет методы сортировки для примитивных типов, таких как:

static void sort(char[] a, int left, int right,
                 char[] work, int workBase, int workLen);
static void sort(int[] a, int left, int right,
                 int[] work, int workBase, int workLen);


Обновление. Хотя это не ответ на оригинальный вопрос о Arrays.sort, geeksforgeeks имеет реализацию timsort для c ++ / java / python3 / c#. Прототип метода для java:

public static void timSort(int[] arr, int n);
...