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

ops/2025/3/16 18:53:05/

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

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) 额外空间,但不稳定。

http://www.ppmy.cn/ops/166278.html

相关文章

堆(Heap)和栈(Stack),这两者通常是指内存管理中两种不同的内存区域

“堆栈”这个术语在计算机科学中有多种解释,主要有两种常见的含义:堆(Heap)和栈(Stack)。这两者通常是指内存管理中两种不同的内存区域。我们来详细探讨一下它们的工作原理、区别和应用。 1. 栈(Stack) 栈是一种后进先出(LIFO,Last In First Out)的数据结构。我们…

OpenFeign的配置类可以进行哪些配置

1. 日志级别(Logger Level) 工作原理 Feign的日志级别控制了日志输出的详细程度,有助于调试和监控。日志级别包括: NONE:不记录任何信息。BASIC:仅记录请求方法和URL及响应状态码和执行时间。HEADERS&am…

.npy文件介绍

.npy 文件是 NumPy 库专用的二进制文件格式,用于高效存储和加载 NumPy 数组(即矩阵或多维数组)。这种格式保留了数组的维度、数据类型(dtype)、形状(shape)等元信息,加载时无需手动解…

《Flutter:开源的跨平台移动应用开发框架》:此文为AI自动生成

《Flutter:开源的跨平台移动应用开发框架》:此文为AI自动生成 一、特点二、 核心概念三、开发环境搭建四、应用场景 Flutter 是 Google 推出并开源的跨平台移动应用开发框架,它使用 Dart 语言进行开发,可帮助开发者通过一套代码库…

[JAVASE] Collection集合的遍历

一. 集合分类 java中的Collection集合分为两类, 分别是单列集合(List)和双列(Map)集合. 1.1 单列集合 1.2 双列集合 二. 集合遍历 2.1 List单列集合的遍历 for each遍历 迭代器遍历 lambda遍历 2.2 Map双列集合的遍历 for each遍历 k-v整体遍历 lambda表达式遍历

AI自动化编程初探

先说vscodeclinemodelscope方案,后面体验trae或者cursor再写写其它的。vscode和trae方案目前来说是免费的,cursor要用claud需要付费,而且不便宜,当然效果可能是最好的。 vscode方案,我的经验是最好在ubuntu上&#xff…

Json实现深拷贝的缺点

1、如果被拷贝对象中的属性有时间对象的话,拷贝出来会为字符串,将不再是对象 var test {name: a,date: [new Date(1536627600000), new Date(1540047600000)],};console.log(test)console.log(JSON.parse(JSON.stringify(test))); 2、如果obj里有RegExp…

C#生产型企业ERP系统管理软件PCB行业ERP进销存MRP管理系统BOM管理

背景 本软件为为苏州某生产型电子科技企业开发的ERP管理软件。 功能说明 希哲管理系统v1.0是一款在流览器上使用的企业管理软件,使用上与客户端版的优势是: 1.安装更新部署方便,只需服务器部署了软件,其它客户端的用户无需安装&am…