news 2026/4/16 17:22:41

以下是常见排序算法的性能对比及选择依据总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
以下是常见排序算法的性能对比及选择依据总结

以下是常见排序算法的性能对比及选择依据总结:

排序方法时间复杂度辅助空间稳定性
直接插入O(n²)O(1)稳定
简单选择O(n²)O(1)不稳定
冒泡排序O(n²)O(1)稳定
希尔排序O(n^1.3)O(1)不稳定
快速排序O(n log n) 平均O(log n)不稳定
堆排序O(n log n)O(1)不稳定
归并排序O(n log n)O(n)稳定
基数排序O(d(n + rd))O(rd)稳定

排序算法选择依据

  1. 当 n 较小时(如 n < 50)

    • 推荐使用直接插入排序简单选择排序
    • 若记录信息量较大(移动代价高),优先选简单选择排序(减少交换次数)。
  2. 当关键字基本有序时

    • 直接插入排序冒泡排序表现优异,尤其是直接插入在接近有序时接近 O(n)。
  3. 当 n 大且关键字位数少(如整数、字符串等可分解位)

    • 可考虑链式基数排序,尤其适用于固定长度的关键字(如电话号码、学号)。
  4. 当 n 较大时

    • 优先选择时间复杂度为O(n log n)的算法:
      • 快速排序:平均性能最优,但最坏情况退化为 O(n²),不稳定。
      • 堆排序:时间稳定 O(n log n),空间仅 O(1),适合内存受限场景,但不稳定。
      • 归并排序:唯一稳定的 O(n log n) 算法,适合要求稳定性的外部排序或链表排序,但需 O(n) 额外空间。

总结建议

  • 追求速度且无稳定性要求→ 快速排序(注意优化基准选择)
  • 需要稳定性且允许额外空间→ 归并排序
  • 内存紧张但需高效→ 堆排序
  • 数据规模小或近似有序→ 直接插入 / 冒泡
  • 特定数据结构(如链表)或关键字可分位→ 基数排序
    快速排序的平均时间复杂度为O(n log n),而最坏情况下退化为O(n²),其根本原因在于基准元素(pivot)的选择以及由此导致的划分不平衡程度

1. 基本思想回顾

快速排序采用分治法:

  • 选取一个基准(pivot),将数组划分为两部分:小于 pivot 的放在左边,大于的放在右边。
  • 递归地对左右子数组进行快排。

设每次划分耗时 O(n),若能均匀分割,则递归深度为 O(log n),总时间复杂度为:

T(n) = 2T(n/2) + O(n) → O(n log n)

这就是平均情况的时间复杂度。


2. 平均情况:O(n log n)

在随机数据中,假设我们随机选择 pivot或使用“三数取中”等策略,则每次划分大概率接近均分。数学期望下,每层平均处理所有元素一次,递归树深度约为 log n 层。

因此,平均时间复杂度为 O(n log n)


3. 最坏情况:O(n²)

当每次选择的 pivot 是当前数组中的最大值或最小值时,会导致极端不均衡的划分:

  • 一边有 n−1 个元素,另一边为空。
  • 每次只能排除一个元素,递归深度达到 n 层。
  • 总体时间变为:
T(n) = T(n−1) + O(n) → O(n²)
典型场景包括:
  • 数组已经有序(升序或降序)
  • 每次选第一个或最后一个元素作 pivot
  • 所有元素相等(未优化重复键)

例如:对[1,2,3,4,5]使用首元素为 pivot,每次划分都极不平衡。


4. 如何避免最坏情况?

方法效果
随机化 pivot使最坏情况具有偶然性,期望性能稳定
三数取中法(mid of three)减少在有序数据上选到极值的概率
双轴快排(如 Java 中的 Dual-Pivot Quicksort)提高分区效率,尤其对重复元素多的数据

总结

快速排序平均性能优秀是因为划分较均衡,递归深度小;而最坏情况发生在每次划分极度不平衡时(如已排序数据),导致递归深度达 n,从而使总时间退化为 O(n²)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 5:49:20

【Docker】核心概念 常用指令总结 Docker Compose

文章目录 核心概念指令一、守护进程&#xff08;Docker Daemon&#xff09;二、镜像&#xff08;Image&#xff09;三、容器&#xff08;Container&#xff09;四、卷管理五、容器挂载卷 数据卷多个容器挂载数据卷容器 Docker 容器和镜像的细节Docker镜像原理Dockerfile关键字D…

作者头像 李华
网站建设 2026/4/6 22:39:04

python数据结构之栈和队列

一、栈&#xff08;Stack&#xff09;栈是一种后进先出&#xff08;LIFO&#xff09;的线性数据结构。就像往手枪弹夹里装子弹时&#xff0c;子弹从弹夹口依次压入&#xff08;入栈 push&#xff09;&#xff0c;先装的子弹会沉到弹夹底部&#xff1b;开枪时&#xff0c;最上面…

作者头像 李华
网站建设 2026/4/16 12:23:15

springboot养殖畜牧业养牛可视化大屏设计与实现vue

目录摘要开发技术核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 SpringBoot与Vue结合的养殖畜牧业养牛可…

作者头像 李华
网站建设 2026/4/16 15:53:27

ssm springboot人脸识别物流运输管理系统vue

目录 摘要技术栈 开发技术 核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 摘要 基于SSM&#xff08;SpringSp…

作者头像 李华
网站建设 2026/4/16 12:28:34

通达信五行金针选股指标公式

VAR1:REF(CLOSE,1); VAR2:SMA(MAX(CLOSE-VAR1,0),7,1)/SMA(Abs(CLOSE-VAR1),7,1)*100; VAR8:SMA(MAX(CLOSE-VAR1,0),14,1)/SMA(ABS(CLOSE-VAR1),14,1)*100; VAR9:SMA(MAX(CLOSE-VAR1,0),21,1)/SMA(ABS(CLOSE-VAR1),21,1)*100; 五行金针:VAR2<15 AND VAR8<25 AND VAR9<…

作者头像 李华