快速排序和调整快速排序有什么区别?

2024-04-25

快速排序和调整快速排序之间的根本区别是什么?快速排序有何改进? Java 如何决定使用它而不是合并排序?


正如蜥蜴比尔所说,调整的快速排序仍然具有与基本快速排序相同的复杂性 - O(N log N) 平均复杂度 - 但调整的快速排序使用一些不同的方法来尝试避免 O(N^2) 最坏情况的复杂性以及使用一些优化来减少平均运行时间 N log N 前面的常数。

最坏情况时间复杂度

当每一步的分区一侧始终具有零个元素时,快速排序会出现最坏情况的时间复杂度。当一个分区中的元素与另一分区中的元素的比率远离 1:1(例如 10000:1)时,就会出现接近最坏情况的时间复杂度。这种最坏情况复杂性的常见原因包括但不限于:

  1. 一种快速排序算法,始终选择子数组中具有相同相对索引的元素作为主元。例如,对于已经排序的数组,始终选择子数组最左边或最右边元素作为主元的快速排序算法的复杂度为 O(N^2)。始终选择中间元素的快速排序算法为风琴管数组提供 O(N^2)([1,2,3,4,5,4,3,2,1] 就是一个例子)。

  2. 不处理数组中重复/重复元素的快速排序算法可以是 O(N^2)。一个明显的例子是对包含所有相同元素的数组进行排序。明确地说,如果快速排序将数组排序为分区,例如 [ = p ],那么左侧分区将始终有零个元素。

这些是如何补救的呢?第一个通常可以通过随机选择枢轴来解决。使用几个元素的中位数作为主元也有帮助,但排序的概率为 O(N^2) 高于使用随机主元。当然,随机选择一些元素的中位数也可能是一个明智的选择。这里通常选择三个随机选择的元素的中值作为基准。

第二种情况,重复的元素,通常可以用类似的方法来解决(链接到pdf)或解决方案荷兰国旗问题 http://en.wikipedia.org/wiki/Dutch_national_flag_problem。然而,Bentley-McIlroy 分区更常用,因为它通常更快。我想出了一种比它更快的方法,但这不是本文的重点。

优化

以下是上面列出的方法之外的一些常见优化,可帮助应对最坏的情况:

  1. 使用收敛指针快速排序而不是基本快速排序。如果您想对此进行更多详细说明,请告诉我。

  2. 当子数组低于特定大小时,对子数组进行插入排序。插入排序的渐进复杂度为 O(N^2),但对于足够小的 N,它优于快速排序。

  3. 使用带有显式堆栈的迭代快速排序,而不是递归快速排序。

  4. 展开部分循环以减少比较次数。

  5. 将主元复制到寄存器并使用数组中的该空间来减少交换元素的时间成本。

其他注意事项

Java 在对对象进行排序时使用归并排序,因为它是一种稳定排序(保留具有相同键的元素的顺序)。快速排序可以是稳定的,也可以是不稳定的,但稳定版本比不稳定版本慢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速排序和调整快速排序有什么区别? 的相关文章

  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • Java/JAXB:将具有相同名称但不同属性值的 XML 元素解组到不同的类成员

    我正在尝试根据其属性之一将具有多个 Fields 元素的 XML 解析为不同的类成员 这是 XML
  • 如何在 OpenAPI 3.0 中定义字节数组

    我正在将 API 从 Swagger 2 0 迁移到 OpenAPI 3 0 在 DTO 中 我有一个指定为字节数组的字段 Swagger 对 DTO 的定义 Job type object properties body type str
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • Maven 多模块项目结构问题

    自从过去几周构建我的 Maven 多模块项目以来 这是我的一次有趣的经历 当我决定使用 Maven 进行构建生命周期管理时 我有几个原因希望选择 Maven A 大多数开发团队都是分开的 这样每个团队都可以在项目中的单独模块上工作 例如团队
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • LibGdx 如何使用 OrthographicCamera 滚动?

    我已经找了 10 个小时 字面意思 我已经完成了 我需要问一下 事情是我正在学习如何使用 LibGdx 来编写 Java 游戏 我正在做一个水平太空飞船游戏 所以 我最糟糕的问题是我不知道如何滚动 我认为绘制会更好地解释 我想绘制一个巨大的
  • JSP 标签+ scriptlet。如何启用脚本?

    我有一个使用标签模板的页面 我的 web xml 非常基本 我只是想在页面中运行一些代码 不 我对标签或其他替代品不感兴趣 我想使用不好的做法 scriptlet 哈哈 到目前为止 我收到了 HTTP ERROR 500 错误 Script
  • 您能让 Tomcat 6 stdout.log 文件表现得像 log4j DailyRollingFileAppender 吗?

    我们使用的是 Tomcat 6 的 Windows 安装 默认情况下 我们应用程序的 log4j 输出将转到 catalina base logs stdout log 文件 该日志文件仅在我们重新启动 Tomcat 时滚动 并且文件名始终
  • 在 Mac 上使用 JRE 打开 jar 文件

    我有一个 jar 文件 旨在通过命令行运行 我不打算在运行应用程序的机器上进行任何java开发 我的思考过程是 因此我应该只需要JRE而不是JDK 此外 JDK 大约是 JRE 的 4 倍 我不想下载它 在 Mac 上安装 JRE 时 它不
  • java 属性文件作为枚举

    是否可以将属性文件转换为枚举 我有一个包含很多设置的属性文件 例如 equipment height equipment widht equipment depth and many more like this and not all a
  • 在关键服务器上对字符串进行内存受限的外部排序,并合并和计算重复项(数十亿个文件名)

    我们的服务器生成如下文件 c521c143 2a23 42ef 89d1 557915e2323a sign xml在其日志文件夹中 第一部分是GUID 第二部分是名称模板 我想计算具有同名模板的文件的数量 例如 我们有 c521c143
  • 嵌入式 tomcat 7 servlet 3.0 注释不起作用

    我有一个精简的测试项目 其中包含 Servlet 版本 3 0 用注释声明 如下所示 WebServlet test public class TestServlet extends HttpServlet private static f
  • 哪种 Java DOM 包装器是最好或最受欢迎的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么在尝试使用 Java 连接到 RDS PostgreSQL 数据库时会收到 SocketTimeoutException?

    我有一个 Spring 应用程序 我试图在 AWS 上托管 几天来我一直在努力配置 我有一个 EC2 实例 并且能够通过 SSH 连接到它 我还在 AWS 中设置了 Postgres RDS 数据库 但我无法使用 IDE 中的代码连接到它
  • Mule/码头设置

    我有一个正在运行的 Mule 应用程序 我想在其上设置 Jetty 来响应 http 请求 以下配置
  • 防止 Firebase 中的待处理写入事务不起作用

    我的目标是在单击按钮时将名称插入 Cloud Firestore 中 但如果用户未连接到互联网 我不希望保存处于挂起状态 我不喜欢 Firebase 保存待处理写入的行为 即使互联网连接已恢复 我研究发现Firebase 开发人员建议使用事
  • 使用 Android 的 Mobile Vision API 扫描二维码

    我跟着这个tutorial http code tutsplus com tutorials reading qr codes using the mobile vision api cms 24680关于如何构建可以扫描二维码的 Andr
  • Java 9 中紧凑字符串和压缩字符串的区别

    有什么优点紧凑的字符串 http openjdk java net jeps 254JDK9 中的压缩字符串 压缩字符串 Java 6 和紧凑字符串 Java 9 都有相同的动机 字符串通常实际上是 Latin 1 因此浪费了一半的空间 和
  • 如何在Java中跨类共享变量,我尝试了静态不起作用

    类 Testclass1 有一个变量 有一些执行会改变变量的值 现在在同一个包中有类 Testclass2 我将如何访问 Testclass2 中变量的更新值 由 Testclass1 更新 试过这个没用 注意 Testclass1和Tes

随机推荐