我有一系列的整数
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))。那第二个怎么样?我还没有找到证据。
答案 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,我想您可能会发现这个概念很有用。