虽然我知道这似乎是显而易见的,但我会解释我的困惑。我一直认为快速排序的最坏情况时间复杂度是O(n^2)。[Arrays.sort(int[])](https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/Arrays.html#sort(int%5B%5D%29)从Java 7到Java 13的文档说:该算法在上提供O(n log(n))性能--许多数据集导致其他快速数据集退化为二次性能,并且通常比传统的(单轴)快速排序实现更快。
这里的关键字是“多”,所以我假设这里的O(n log(n))指的是平均情况,而且仍然存在导致O(n^2)最坏情况的数据集。
但是在Java14和更高版本中,[Arrays.sort(int[])](https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/util/Arrays.html#sort(int%5B%5D%29)的文档说:该算法在所有数据集上提供O(n (N))性能。
那么,对于现在改进的快速排序实现O(n log(n))来说,最坏的情况是什么呢?谁来澄清一下。
发布于 2022-03-16 12:36:01
您需要检查Arrays.sort(int[])的更深层次的实现。
在里面有一个函数DualPivotQuicksort.sort(.)是用来分类的。
在java 7到13中,您可以看到函数有一种故障安全机制,在复杂度接近O(n^2)时,它会更改排序类型,它正在更改为QuickSort,平均复杂度为O(n log ),但最糟糕的是O(n^2),这就是为什么javaDoc描述中说“许多数据集”。
另一方面,由于java 14由于复杂度较高而安全失败,所以将排序算法改为堆排序算法,而堆排序算法的复杂度为O(n log ),因此它永远不会比这慢。
https://stackoverflow.com/questions/71496763
复制相似问题