在Java中,方法Arrays.sort有两个重载(在本文中,我对此很感兴趣),一个重载用于基本类型,另一个重载用于引用类型。他们使用不同的排序算法。

如何使用用于引用类型的算法对原始类型进行排序(既不使用列表也不将它们转换为引用类型)

方法Arrays.sort(int[])使用Dual-Pivot Quicksort

方法Arrays.sort(Object[])使用TimSort

如果我有int[] array = { /* some values here */ };,如何使用TimSort对其进行排序?
(我知道使用Integer[] array = { /* some values here */ };将使用TimSort,但由于使用对象而不是原始数据会产生开销,因此我不希望这样做,以后可能会有一些装箱和拆箱)

还是在原始数据上使用TimSort不切实际?

我为TimSort java.util.TimSort找到了一个类,但是无法在代码中访问它。

出现此问题的原因是Quicksort的O(n^2)情况最糟,我遇到了利用该情况的数组。而TimSort的(n log(n))情况最糟,而O(n)的情况最糟。

最佳答案

Java内置的TimSortComparableTimSort不适用于原始数据类型的数组,它只是sort方法需要对象数组

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具有针对c ++ / java / python3 / c#的timsort实现。 Java的方法原型是:

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

关于java - 如何在原始数据类型数组上调用Java内置TimSort,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60704997/

10-12 06:22