虽然我知道这似乎很明显,但我会解释我的困惑.我一直认为Quicksort最糟糕的时间复杂度是O(n^2).从Java 7到Java 13的Arrays.sort(int[])的文档说明:

这里的关键字是"many",所以我假设这里的O(n log(n))指的是平均情况,并且仍然存在导致O(n^2)最坏情况的数据集.

但在Java 14及以上版本中,Arrays.sort(int[])的文档说明:

那么,这种改进的快速排序实现现在最糟糕的情况是O(n log(n))?请有人澄清一下.

推荐答案

您需要更深入地判断数组的实现.排序(int[]).

里面有一个快速排序功能.排序(…)用于分类.

你可以在java 7到13中看到,这个函数有一个故障安全机制,当复杂度接近O(n^2)时,它会改变排序类型,它会变为快速排序,平均复杂度为O(n logn),但最糟糕的是O(n^2),这就是为什么在javaDoc描述中说"许多数据集".

另一方面,由于java 14对更高复杂度的故障保护正在将排序算法更改为最复杂度为O(n logn)的heapsort,所以它永远不会比这慢.

Java相关问答推荐

如果它最终将被转换为int类型,为什么我们在Java中需要较小的integer类型?

使用hibiter中特定字段的where条款自定义映射

当我用OkHttpClient重写shouldInterceptRequest来发布数据时,Android WebView正在以纯HTML加载URL内容

在现代操作系统/硬件上按块访问数据值得吗?

替换com. sun. jndi. dns. DnsContextFactory Wildfly23 JDK 17

Java函数式编程中的双值单值映射

Junit with Mockito for java

如何创建同一类的另一个对象,该对象位于变量中?

Spring data JPA/Hibernate根据id获取一个列值

有没有办法让扩展变得多态?

Mac上的全屏截图在使用JavaFX时不能正常工作吗?

JOOQ中的子查询使用的是默认方言,而不是配置的方言

基于接口的投影、原生查询和枚举

尽管通过中断请求线程死亡,但线程仍将继续存在

Lombok@Nonnull是否也对供应商有影响?

如何在Java springboot中从一个端点发送多个时间响应?

STREAMS减少部分结果的问题

JFree Chart从图表中删除边框

如何在Java中的重写方法参数中强制(Enum)接口实现?

[jdk21][Foreign Function&;Memory API]MemoryLayout::varHandle通过可变数组进行 struct 化的问题