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

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

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) 额外空间,但不稳定。
相关推荐
多多*8 分钟前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle
逐光沧海9 分钟前
数据结构基础--蓝桥杯备考
数据结构·c++·算法·蓝桥杯
Kidddddult10 分钟前
力扣刷题Day 48:盛最多水的容器(283)
算法·leetcode·力扣
爱喝酸奶的桃酥11 分钟前
MYSQL数据库集群高可用和数据监控平台
java·数据库·mysql
AndrewHZ21 分钟前
【Python生活】如何构建一个跌倒检测的算法?
python·算法·生活·可视化分析·陀螺仪·加速度计·跌倒检测
唐僧洗头爱飘柔95271 小时前
【SSM-SSM整合】将Spring、SpringMVC、Mybatis三者进行整合;本文阐述了几个核心原理知识点,附带对应的源码以及描述解析
java·spring·mybatis·springmvc·动态代理·ioc容器·视图控制器
写个博客1 小时前
代码随想录算法训练营第三十九天
算法
骑牛小道士1 小时前
Java基础 集合框架 Collection接口和抽象类AbstractCollection
java
alden_ygq1 小时前
当java进程内存使用超过jvm设置大小会发生什么?
java·开发语言·jvm
triticale2 小时前
【Java】网络编程(Socket)
java·网络·socket