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

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

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.mzph.cn/pingmian/72392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PentestGPT 下载

PentestGPT 下载 PentestGPT 介绍 PentestGPT(Penetration Testing GPT)是一个基于大语言模型(LLM)的智能渗透测试助手。它结合了 ChatGPT(或其他 GPT 模型)与渗透测试工具,帮助安全研究人员自…

防火墙虚拟系统实验

一实验拓扑 二实验过程 配置资源 创建虚拟系统 配置管理员 创建安全策略

代码随想录算法训练营第31天 | 56. 合并区间 738.单调递增的数字 968.监控二叉树

56. 合并区间 代码随想录 56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals,(a,b)->{if(a[0] b[0])return a[1] - b[1];return a[0] - b[0];});List<int[]> result new Arra…

Go语言对于MySQL的基本操作

一.下载依赖 终端中输入&#xff1a; go get -u github.com/go-sql-driver/mysql 导入包 import ("database/sql"_ "github.com/go-sql-driver/mysql" ) 二.案例 package main//go get-u github.com/go-sql-driver/mysql 获取驱动 import ("databa…

Linux与深入HTTP序列化和反序列化

深入HTTP序列化和反序列化 本篇介绍 在上一节已经完成了客户端和服务端基本的HTTP通信&#xff0c;但是前面的传递并没有完全体现出HTTP的序列化和反序列化&#xff0c;为了更好得理解其工作流程&#xff0c;在本节会以更加具体的方式分析到HTTP序列化和反序列化 本节会在介绍…

基于Python+SQLite实现(Web)验室设备管理系统

实验室设备管理系统 应用背景 为方便实验室进行设备管理&#xff0c;某大学拟开发实验室设备管理系统 来管理所有实验室里的各种设备。系统可实现管理员登录&#xff0c;查看现有的所有设备&#xff0c; 增加设备等功能。 开发环境 Mac OSPyCharm IDEPython3Flask&#xff…

深拷贝and浅拷贝!

一、什么是拷贝&#xff1f;什么是深拷贝和浅拷贝&#xff1f; &#xff08;1&#xff09;拷贝&#xff1a;拷贝就是为了复用原对象的部分or全部数据&#xff0c;在原对象的基础上通过复制的方式创建一个新的对象。 拷贝对象可以分为三种类型&#xff1a;直接赋值、浅拷贝和深拷…

高频面试题(含笔试高频算法整理)基本总结回顾43

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(34)混元金斗装万物 - 0-1背包问题(二维DP)

《灵珠觉醒:从零到算法金仙的C++修炼》卷三天劫试炼(34)混元金斗装万物 - 0-1背包问题(二维DP) 哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的混元谷,谷中有一座巨大的混元金斗,斗身闪烁着神秘的光芒。谷口有一块巨大的石碑,上面刻着一行文字:“欲…

网络爬虫【简介】

我叫补三补四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲视图 一、网络爬虫的定义 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称为网络蜘蛛、网络机器人等&#xff0c;是一种按照一定规则自动抓取互联网信息的程序或脚本。它…

​AI时代到来,对电商来说是效率跃升,还是温水煮青蛙

​凌晨三点的义乌商贸城&#xff0c;95后创业者小王&#xff0c;静静地盯着屏幕上的AI工具&#xff0c;竟露出了笑容。这个月他的跨境玩具店销量提升了不少&#xff0c;从之前的状态翻了3倍&#xff1b;而且团队人数有所变化&#xff0c;从5人缩减到了2人&#xff08;其中包括他…

PDF文件密码保护破解:安全解密的步骤与技巧

PDF文件加密后&#xff0c;需要特定的密码才能访问内容。以下是一些常见的方法来解密PDF文件&#xff1a; 方法一&#xff1a;使用Adobe Acrobat 如果你有Adobe Acrobat Pro&#xff0c;可以使用它来解密PDF文件。 打开Adobe Acrobat Pro&#xff1a; 启动Adobe Acrobat Pro…

qt 自带虚拟键盘的编译使用记录

一、windows 下编译 使用vs 命令窗口&#xff0c;分别执行&#xff1a; qmake CONFIG"lang-en_GB lang-zh_CN" nmake nmake install 如果事先没有 指定需要使用的输入法语言就进行过编译&#xff0c;则需要先 执行 nmake distclean 清理后执行 qmake 才能生效。 …

Java开发之数据库应用:记一次医疗系统数据库迁移引发的异常:从MySQL到PostgreSQL的“dual“表陷阱与突围之路

记一次医疗系统数据库迁移引发的异常&#xff1a;从MySQL到PostgreSQL的"dual"表陷阱与突围之路 一、惊魂时刻&#xff1a;数据库切换引发的系统雪崩 某医疗影像系统在进行国产化改造过程中&#xff0c;将原MySQL数据库迁移至PostgreSQL。迁移完成后&#xff0c;系…

C++刷题(二):栈 + 队列

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及刷题记录&#xff0c;使用语言为C。 每道题我会给出LeetCode上的题号&#xff08;如果有题号&#xff09;&#xff0c;题目&#xff0c;以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的…

精通游戏测试笔记(持续更新)

第一章、游戏测试的两条规则 不要恐慌 不要将这次发布当作最后一次发布 不要相信任何人 把每次发布当作最后一次发布 第二章&#xff1a;成为一名游戏测试工程师

Windows功能之FTP服务器搭建

一、创作背景 之前有用linux系统搭建过ftp服务器&#xff0c;最近想着用windows系统也顺便搭建一个&#xff0c;看网上有第三方服务软件一键部署&#xff0c;记得windows可以不借助第三方软件就可以搭建&#xff0c;就想顺便操作试试&#xff0c;结果老是连接不上&#xff0c;费…

星型组网模块的两种交互方式优缺点解析

星型组网模块简介 星型组网模块工作在433MHz频段&#xff1b;星型组网模块集主机&#xff08;协调器&#xff09;、终端为一体&#xff0c;星型组网模块具有长距离、高速率两种传输模式&#xff0c;一个主机&#xff08;协调器&#xff09;支持多达200个节点与其通讯&#xff0…

二分+前缀和——森林的最大美丽值

森林的最大美丽值(二分差分数组) 题目分析 求最小值的最大值&#xff0c;联想到二分。 第一阶段二段性分析 对于所有树的高度都可以大于等于mid&#xff0c;那么我们可以确定高度小于mid的值一定也可以&#xff0c;但是此时我需要找的是最大的高度&#xff0c;那么mid一定比…

Pytorch实现之最小二乘梯度归一化设计

简介 简介:LSGAN提出了一种利用最小二乘法来计算两个数据分布之间的距离,该论文在此基础上采用梯度归一化来进一步稳定训练。 论文题目:LSN-GAN: A Novel Least Square Gradient Normalization for Generative Adversarial Networks(LSN-GAN:一种新的生成对抗网络的最小…