我想在Java中对一个int[] 数组
进行排序,但是将排序后的数组存储为新数组而不是覆盖原数组。
最明显的方法似乎是创建该数组的副本,然后对该新数组进行排序,如下所示:
int[] a2 = new int[a.length];
for (int i = 0; i < this.length; i++) {
a2[i] = a[i];
}
Arrays.sort(a2);
然而,是否有更快的方法?我们能否在将旧数组元素复制到新数组的同时进行排序呢?
你可以使用
int[] a2 = IntStream.of(a).sorted().toArray();
但我怀疑它不会比这个更快
int[] a2 = a.clone();
Arrays.sort(a2);
不管怎样,它的复杂度是相同的,因此不要期望速度提高超过一个常数因子。
在迭代旧数组时对新数组进行排序不会更快。为此,您可以使用System.arraycopy()而不是创建自己的排序或复制函数。
从指定的源数组开始位置复制到目标数组的指定位置的数组。
示例:
int[] a1 = new int[]{1,2,3,4,5}; // I suppose a1...
int[] a2 = new int[a1.length];
System.arraycopy( a1, 0, a2, 0, a1.length );
Arrays.sort(a2);
int[] a2 = IntStream.of(a).sorted().toArray();
将数组a进行排序,并将结果存储在新的数组a2中。
TreeSet
,以下代码可能会达到目的:TreeSet<Integer> copied = new TreeSet<>();
for (int i = 0; i < array.length; i++) {
copied.add(i);
}
我尝试测试差异,实际上这取决于数据的大小以及数组中的数据。
然而,我无法评论此方法的确定性,但我肯定会运行几个实验并在此发布我的发现。
更新:
我使用以下代码测试了TreeSet
的性能。
import java.util.Arrays;
import java.util.Random;
import java.util.TreeSet;
class TestArrayCopy {
public static void main(String[] arg) throws java.io.IOException {
for (int i = 1; i <= 10; i++) {
int arr[] = randomArray();
System.out.println("Array Size: " + arr.length + ". Results for case #" + i);
System.out.println("Using Array Copy:");
copyAndSort(arr);
System.out.println("Using Tree Set:");
useTreeSet(arr);
System.out.println("----------------------------");
}
}
public static void copyAndSort(int array[]) {
long start = System.nanoTime();
for (int j = 0; j < 100; j++) {
int copied[] = Arrays.copyOf(array, array.length);
Arrays.sort(copied);
}
long end = System.nanoTime();
System.out.println(end - start);
}
public static void useTreeSet(int array[]) {
long start = System.nanoTime();
for (int j = 0; j < 100; j++) {
TreeSet<Integer> copied = new TreeSet<>();
for (int i = 0; i < array.length; i++) {
copied.add(i);
}
}
long end = System.nanoTime();
System.out.println(end - start);
}
public static int[] randomArray() {
Random random = new Random();
int len = 100000 + random.nextInt(1000000);
int arr[] = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = random.nextInt(1000000);
}
return arr;
}
}
以下是在搭载Java 8的Core-i7 64位系统上获得的结果:
数组大小:616568。第1个案例的结果copied.toArray(...)
以获取实际结果。 - aioobe
int[] a2 = Arrays.copyOf(a1, a1.length)
。 - Thilo