【排序算法对比】快速排序、归并排序、堆排序

排序算法对比:快速排序、归并排序、堆排序

1. 快速排序(Quick Sort)

原理

快速排序采用 分治法 (Divide and Conquer),通过选取基准值(pivot),将数组划分为 小于基准值大于基准值 的两个部分,并递归排序。

特点

  • 时间复杂度
    • 最优:O(n log n)
    • 平均:O(n log n)
    • 最差:O(n²)(当选取的 pivot 总是最小或最大值时,会退化成冒泡排序)
  • 空间复杂度O(log n)(递归调用栈)
  • 是否稳定 :❌ 不稳定(交换过程中可能改变相同元素的相对位置)
  • 适用场景
    • 适用于大规模数据排序
    • 数据较随机时性能较优
    • 不适用于数据接近有序需要稳定性的场景

2. 归并排序(Merge Sort)

原理

归并排序同样采用 分治法 ,将数组拆分成 左右两部分 ,分别排序后再 合并(merge),确保整体有序。

特点

  • 时间复杂度
    • 最佳、最差、平均O(n log n)(即使是最坏情况下也能保持 O(n log n)
  • 空间复杂度O(n)(额外存储归并时的数组)
  • 是否稳定 :✅ 稳定(归并过程不会打乱相同元素的相对顺序)
  • 适用场景
    • 适用于数据量大且需要稳定性的情况
    • 适用于链表排序
    • 适用于外部排序(大数据排序),因其可并行处理数据

3. 堆排序(Heap Sort)

原理

堆排序基于 二叉堆(Binary Heap) 数据结构,先将数组构造成 最大堆(Max Heap),然后依次取出堆顶元素(最大值),调整堆结构,最终得到一个有序数组。

特点

  • 时间复杂度
    • 最优、平均、最差:O(n log n)
  • 空间复杂度O(1)(原地排序,不需要额外空间)
  • 是否稳定 :❌ 不稳定(堆调整过程中可能改变相同元素的相对位置)
  • 适用场景
    • 适用于 大规模数据排序
    • 适用于 对最坏情况有较好保证 的场景
    • 适用于 优先队列的实现

4. 排序算法对比

排序算法 时间复杂度(最优) 时间复杂度(平均) 时间复杂度(最差) 空间复杂度 是否稳定 适用场景
快速排序 O(n log n) O(n log n) O(n²)(退化) O(log n) ❌ 不稳定 适用于大规模数据,且数据较随机时性能较优
归并排序 O(n log n) O(n log n) O(n log n) O(n) ✅ 稳定 适用于数据量较大且需要稳定性的情况,如链表排序、外部排序
堆排序 O(n log n) O(n log n) O(n log n) O(1) ❌ 不稳定 适用于 原地排序 且对 最坏情况 有较好保证的场景

5. 选择哪种排序?

  • 快速排序:一般情况下最快,适用于数据规模大、数据随机分布的情况。
  • 归并排序 :适用于数据量大、稳定性要求高 的情况,如数据库排序。
  • 堆排序 :适用于 大规模数据排序 ,适用于 时间复杂度需要稳定的情况

推荐:

  • 如果数据量大 ,推荐 快速排序(但注意避免最坏情况)。
  • 如果要求稳定排序 ,推荐 归并排序
  • 如果空间受限 ,推荐 堆排序 (因为它是 O(1) 空间复杂度的 O(n log n) 排序算法)。

总结:

  1. 快速排序 是平均情况下最快的 O(n log n) 排序,但最坏情况下退化为 O(n²)
  2. 归并排序 始终O(n log n),但需要额外 O(n) 空间,是稳定排序。
  3. 堆排序 适用于大数据且需要 O(1) 额外空间,但不稳定。
相关推荐
Evan芙9 分钟前
搭建nexus服务,实现本地仓库、代理仓库
java·nginx·tomcat
乂爻yiyao16 分钟前
Java LTS版本重要升级特性对照表
java·开发语言
原来是好奇心30 分钟前
深入Spring Boot源码(六):Actuator端点与监控机制深度解析
java·开发语言·源码·springboot
橘颂TA1 小时前
【剑斩OFFER】算法的暴力美学——翻转对
算法·排序算法·结构与算法
叠叠乐1 小时前
robot_state_publisher 参数
java·前端·算法
过期动态1 小时前
JDBC高级篇:优化、封装与事务全流程指南
android·java·开发语言·数据库·python·mysql
WizLC1 小时前
【Java】各种IO流知识详解
java·开发语言·后端·spring·intellij idea
Mr.朱鹏1 小时前
SQL深度分页问题案例实战
java·数据库·spring boot·sql·spring·spring cloud·kafka
小张快跑。1 小时前
【Java企业级开发】(十一)企业级Web应用程序Servlet框架的使用(上)
java·前端·servlet
星星不打輰1 小时前
SSM项目--SweetHouse 甜蜜蛋糕屋
java·spring·mybatis·ssm·springmvc