在java中,方法Arrays.sort有两个重载(在这篇文章中我很感兴趣),一个是用于原始类型的,另一个是用于引用类型的。它们使用不同的排序算法。
如何使用用于引用类型的算法对基元类型进行排序(不使用列表将它们转换为引用类型)
方法Arrays.sort(int[])使用双轴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)情况
更新:
实际上,我感兴趣的是有一个内置的TimSort方法,它不需要是Arrays.sort。如果有任何其他内置方法可以使用TimSort对原始数据类型进行排序,那么它是完全受欢迎的。
发布于 2020-03-16 23:43:38
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已经为c++/java/python3/c#实现了timsort。java的方法原型是:
public static void timSort(int[] arr, int n);https://stackoverflow.com/questions/60704997
复制相似问题