如何有效地对int数组进行排序

时间:2016-01-16 19:54:04

标签: java arrays sorting

我有一系列的整数

int array[] = ...

我可以使用

对其进行排序
Arrays.sort(array);

但Arrays.sort使用quicksort,有时会导致 O(n ^ 2)复杂性。我有一个想法将它转换为List然后对它进行排序(使用mergesort,所以上限是 O(n log n)),但缺点是它创建了很多对象,因为拳击从int到整数。

我的第三种方法是:

array = Arrays.stream(array).sorted().toArray();

我只在IntStream上运行,但不幸的是文档中没有提到复杂性。

我一直在寻找类似的问题而且我只发现这个Big-O complexity of java.util.stream.Stream<T>.sorted()根本没有帮助,因为有两个不同的答案(首先当然是部分错误,因为Arrays.sort并不总是 O(n log n))。那第二个怎么样?我还没有找到证据。

3 个答案:

答案 0 :(得分:1)

您应该调查Heapsort,稍微慢一点,它会保证O(n Log n)。 Quicksort vs heapsort

还有教科书解释here

答案 1 :(得分:1)

如果整数范围很小,则可以使用Counting Sort,它使用数字作为数组索引,而不像具有O的下限的比较排序算法( nlogn ) (例如Quicksort或Mergesort),它的复杂度为O( n + k ),其中 k 是你的最小值和最大值之间的范围。

选择哪种算法总是取决于您对阵列元素分布的任何额外知识。

答案 2 :(得分:0)

自己实施mergesort,这不是火箭科学。 实现它之后,请花一点时间运行一些基准测试,并将实现的性能与Arrays.sort的性能进行比较。那里可能会有一些惊喜等待你。

另外,请阅读premature optimization,我想您可能会发现这个概念很有用。