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

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

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) 额外空间,但不稳定。
相关推荐
魔道不误砍柴功2 分钟前
Java 2025:解锁未来5大技术趋势,Kotlin融合&AI新篇
java·人工智能·kotlin
自由鬼2 分钟前
AI当前状态:有哪些新技术
人工智能·深度学习·算法·ai·chatgpt·deepseek
奋进的小暄7 分钟前
贪心算法(20)(java)整数替换
开发语言·算法
小可爱的大笨蛋22 分钟前
十倍开发效率 - IDEA 插件之RestfulBox - API
java·ide·intellij-idea
爱的叹息1 小时前
【java实现+4种变体完整例子】排序算法中【桶排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
java·开发语言·排序算法
热爱编程的小李1 小时前
智能麻将出牌组件
java
王齐家04061 小时前
每日一题算法——移除链表元素、反转链表
数据结构·算法·leetcode·链表
天天扭码1 小时前
一分钟解决 | 高频面试算法题——和为 K 的子数组(前缀和)
前端·算法·面试
ChoSeitaku1 小时前
NO.97十六届蓝桥杯备战|数论板块-最大公约数和最小公倍数|欧几里得算法|秦九韶算法|小红的gcd(C++)
c++·算法·蓝桥杯
侧耳倾听1111 小时前
java 设计模式之单例模式
java·单例模式·设计模式