一尘不染

Java 按降序对基本类型的数组进行排序

java

我有一个很大的原始类型数组(double)。如何按降序排列元素?

不幸的是,Java API不支持使用比较器对原始类型进行排序。

可能想到的第一种方法是将其转换为对象列表(装箱):

double[] array = new double[1048576];    
Arrays.stream(array).boxed().sorted(Collections.reverseOrder())…

但是,对数组中的每个原语进行装箱速度太慢,并且会导致很大的GC压力!

另一种方法是排序然后反转:

double[] array = new double[1048576];
...
Arrays.sort(array);
// reverse the array
for (int i = 0; i < array.length / 2; i++) {
     // swap the elements
     double temp = array[i];
     array[i] = array[array.length - (i + 1)];
     array[array.length - (i + 1)] = temp;
}

这种方法也很慢 -特别是在数组已经很好排序的情况下。

有什么更好的选择?


阅读 980

收藏
2020-03-20

共1个答案

一尘不染

Java Primitive包含用于基于自定义比较器对基本数组进行排序的功能。使用它和Java 8,你的示例可以编写为:

double[] array = new double[1048576];
...
Primitive.sort(array, (d1, d2) -> Double.compare(d2, d1), false);

如果你使用的是Maven,则可以将其包含在:

<dependency>
    <groupId>net.mintern</groupId>
    <artifactId>primitive</artifactId>
    <version>1.2.1</version>
</dependency>

当你将false第三个参数传递给时sort,它将使用不稳定的排序,这是Java内置的double-pivot quicksort的简单编辑。这意味着速度应接近内置分拣的速度。

2020-03-20