当前位置: 首页 > 知识库问答 >
问题:

如何在原始数据类型数组上调用java内置的TimSort

韩恺
2023-03-14

在java中,方法是数组。sort有两个重载(我在本文中感兴趣),一个用于基本类型,另一个用于引用类型。他们使用不同的排序算法。

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

方法<代码>数组。排序(int[])使用双枢轴快速排序。

方法<代码>数组。排序(对象[])使用TimSort。

如果我有一个int[]数组 = { /* 这里的一些值 */ };,我如何使用TimSort对其进行排序?(我知道使用整数[]数组 = { /* 这里的一些值 */ }; 将使用TimSort,但我不希望这样,因为使用Object而不是原始数据的开销,以后可能会有一些装箱和解装箱)

或者对原始数据使用TimSort是否效率低下?

我已经找到了一个类TimSortjava.util.TimSort,但我无法访问它在我的代码。

这个问题的原因是快速排序的最坏情况是O(n^2),我遇到了一个利用这种情况的数组。而TimSort的最坏情况是(n log(n)),最佳情况是O(n)

更新:

实际上,我只对TimSort的内置方法感兴趣,它不需要是数组。排序。如果有任何其他内置方法可以使用TimSort对原始数据类型进行排序,那么它是完全受欢迎的。

共有1个答案

周超英
2023-03-14

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);


使现代化虽然这不是关于数组的原始问题的答案。排序,Geeksforgeks实现了c/java/python3/c的timsort。java的方法原型是:

public static void timSort(int[] arr, int n);
 类似资料:
  • 问题内容: 我是Kotlin的新手,正在玩数据类型。我选择了一个类型,然后尝试通过说来将其强制转换为a ,这在Java中是有效的(从语法上讲,但这是正确的)。但是,此操作失败,表示无法将Int强制转换为Double。我假设这是因为它是基于Integer类而不是原始的int数据类型构建的。我是正确的,最有价值的方法是什么?有一个功能,但这似乎效率低下且笨拙。 问题答案: 我花了一个类型,然后试图将它

  • 当函数声明类型参数时: 我应该如何在kotlin中调用原始的未类型化的类型化函数? 在爪哇中,我有: 因为< code>typedFunction声明了一个名为< code>T的类型,并将它的两个参数绑定到这个声明的类型,并且在调用站点上,我循环了多个确切类型未知的值(但已知是安全的,两个参数符合相同的类型),所以我不能按预期的方式调用typedFunction。我得把它铸造成一种原始类型。 如何

  • 问题内容: 如何在Java中通过引用传递基本类型?例如,如何使传递给方法的值可修改? 问题答案: 在Java中,没有一种方法可以通过引用直接传递基元。 一种解决方法是改为将引用传递给包装类的实例,该实例然后将原语包含为成员字段。这样的包装器类可能非常容易为自己编写: 但是,一些预先构建的包装器类又如何,因此我们不必编写自己的包装器类?

  • 问题:我无法存储号码“600851475143”。我意识到这个数字比int所能容纳的要大,比最大long值要小。然而,我的程序没有把变量“number”注册成一个long,而是注册成一个int。有人能解释一下这个问题吗? **-问题线 } 解决方案:正如吉姆在下面所说,为了长型,必须在数字末尾加上“L”或“L”。“如果整数文字以字母L或L结尾,则为long类型;否则为int类型。建议使用大写字母L

  • 我是科特林的新手,我在玩数据类型。我取了一个<code>Int</code>类型,然后尝试将其转换为<code>Double</code>,将<code>num表示为Double>/code,这是一个在java中有效的调用(非语法上,但你明白了)。然而,这失败了,表示Int不能强制转换为Double。我假设这是因为它是基于Integer类而不是原始int数据类型构建的。我说得对吗?什么是最有效的价

  • 是否可以只使用一行代码就将输入变量的数据类型(可以是任何基元类型,int、bool、float、double)作为字符串返回?我知道对于字符串类型,使用和可以很容易地做到这一点,但我不确定如何使用这些方法返回基元类型的类型。我还想保持我的代码非常简短,最好只用一行。 我到处找了找,找不到任何地方,这个问题已经以我要求的方式得到了回答。