十大经典排序算法复杂度、应用场景总结 | 插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序、桶排序、计数排序

前言

好久不见辽,uu们!这几天由于准备专业课的课堂pre,因此一直没能给 “c++实现十大经典排序算法” 系列结个尾。本次的十大排序算法包括:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序、桶排序、计数排序,有关以上排序算法的原理介绍及代码分享的文章都放在了本篇的末尾,感兴趣的佳人可以点击链接,“ 嗖 ” 的一下传送过去哈!

今天这篇文章,主要是对前段时间连更的排序算法的总结,包括每个算法的复杂度、使用场景等。所有分享均来自学校算法课的总结和网上资料搜集的总结,并且是自己思考过认为正确的内容(主要思考依据是已经ac过的代码),如果uu们在观看本系列文章的任何一篇中有所疑问,欢迎在评论区交流分享。

十大算法的复杂度总结

以下图片来自于 1.0 十大经典排序算法 | 菜鸟教程 (runoob.com)

 

  • 稳定性是指在排序算法完成后,大小相等的值的顺序和它们最初的先后顺序一致,在需要保持原始顺序或者相同关键字元素的相对顺序不变的应用场景中,稳定排序算法能够提供更可靠的排序结果,确保后续处理和分析的正确性。例如在教务系统中,对我们的成绩进行排名——刚开始教务系统的名单中肯定是按学号排序的,当在此基础上按照成绩排序时,假如有多名学生成绩相同,使用稳定性的排序算法可以保持相同成绩学生的原始顺序,即序号小的在前。

排序算法可以分为内部排序和外部排序,这是根据排序过程中数据存放的位置不同而划分的两种排序方式。

  1. 内部排序(Internal Sorting): 内部排序是指所有待排序的数据都能够一次性载入内存,并且排序过程中所有的操作都在内存中进行。内部排序适用于数据量较小,可以完全存放在内存中的情况。

  2. 外部排序(External Sorting): 外部排序是指待排序的数据量太大,无法一次性载入内存,需要借助外部存储(如磁盘、SSD等)进行排序。外部排序通常分为两个阶段:首先在内存中对数据进行部分排序(通常称为初步排序或者分段排序),然后将部分排序后的数据写入外部存储,最后对外部存储中的数据进行归并排序等操作得到最终的排序结果。

对于以上十种排序算法:

  • 内部排序算法:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序。

  • 外部排序算法:基数排序、桶排序、计数排序。

内部排序算法通常适用于数据量较小的情况,因为它们的排序过程可以完全在内存中进行,而外部排序算法适用于数据量较大,无法一次性载入内存的情况,因为它们可以将数据分批加载并排序。

该部分理论到此结束,不过在目前刷题时,只要是排序,我们一般都直接使用STL中封装好的的sort()函数,sort()帮我们实现了快速排序算法,并且我们可以自己设定排序方式,使其实现升序、降序或者对结构体等的排序。总之,主打一个方便。

算法的应用场景

  1. 插入排序: 适用于小规模数据或者部分有序的数据。由于插入排序在处理小规模数据时性能较好,并且对部分有序的数据具有稳定性,因此常用于对已经接近有序的数据进行排序,或者作为其他排序算法的优化手段。

  2. 希尔排序: 适用于中等规模数据,特别是对于大规模数据的排序。希尔排序通过增量序列将数据分组并分别进行插入排序,能够在一定程度上提高插入排序的效率,因此适合处理大规模数据的排序问题。

  3. 选择排序: 适用于小规模数据,但在实际应用中效率较低。选择排序每次选择未排序部分中的最小元素放置到已排序部分的末尾,因此适合处理小规模数据的排序,但由于其时间复杂度较高,不适合处理大规模数据。

  4. 冒泡排序: 适用于小规模数据,但在实际应用中效率较低。冒泡排序通过比较相邻元素并交换,将较大(或较小)的元素逐步移动到末尾,因此适合处理小规模数据的排序,但时间复杂度较高,不适合处理大规模数据。

  5. 归并排序: 适用于任意规模的数据,特别是对于大规模数据的排序。归并排序采用分治法将数据分解为小问题并逐步解决,然后将解合并起来,因此适合处理大规模数据的排序问题,并且具有稳定性。

  6. 快速排序: 适用于任意规模的数据,特别是对于大规模数据的排序。快速排序采用分治法,通过选择一个基准元素将数据分为两部分,并递归地对每部分进行排序,因此能够快速地处理大规模数据的排序问题。

  7. 堆排序: 适用于任意规模的数据,特别是对于大规模数据的排序。堆排序通过构建一个堆结构来实现排序,具有较好的时间复杂度和空间复杂度,并且能够处理大规模数据的排序问题。

  8. 基数排序: 适用于数据范围较小但数据量较大的情况。基数排序将数据按照位数进行排序,从低位到高位依次排序,因此适合处理数据范围较小但数据量较大的排序问题。

  9. 桶排序: 适用于数据范围较小但数据量较大的情况。桶排序将数据分为若干个桶,并将数据分配到不同的桶中,然后对每个桶中的数据进行排序,最后合并桶中的数据,因此适合处理数据范围较小但数据量较大的排序问题。

  10. 计数排序: 适用于数据范围较小且数据量较大的情况。计数排序统计数据中每个元素出现的次数,并根据统计结果将数据排序,因此适合处理数据范围较小但数据量较大的排序问题,并且具有稳定性。本质上来说,基数排序、 桶排序、计数排序都是使用了“桶”的思想,所以适用范围基本一致。

排序算法文章链接

经典排序算法之基数排序详解|c++代码实现|简单易懂-CSDN博客

经典排序算法之桶排序详解|c++代码实现|简单易懂-CSDN博客

经典排序算法之计数排序|c++代码实现-CSDN博客 

经典排序算法之堆排序详解|c++代码实现|什么是堆排序|如何代码实现堆排序-CSDN博客 

经典排序算法之快速排序|c++代码实现|什么是快速排序|如何代码实现快速排序-CSDN博客 

经典排序算法之归并排序|递归和迭代法代码均提供|c++代码实现|什么是归并排序|如何代码实现-CSDN博客

经典排序算法之希尔排序|c++代码实现||什么是希尔排序|如何代码实现-CSDN博客 

经典排序算法之插入排序|c++实现|什么是插入排序|如何代码实现-CSDN博客

排序算法之选择排序|c++实现-CSDN博客 

经典排序算法之冒泡排序|c++代码实现-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/484379.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

递归课堂案例

一个不知名大学生,江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion:2024.03.24 Last edited: 2024.03.24 目录 递归课堂案例 第1关:斐波那契数列 任务描述 相关知识 编程要求 代码如下&#xff1…

java每日一题——买啤酒(递归经典问题)

前言: 非常喜欢的一道题,经典中的经典。打好基础,daydayup!!!啤酒问题:一瓶啤酒2元,4个盖子可以换一瓶,2个空瓶可以换一瓶,请问10元可以喝几瓶 题目如下: 啤酒问题:一瓶…

学习笔记 | 微信小程序项目day03

今日学习内容 配置自定义导航栏通用轮播组件通用的轮播图组件完善以及主页调用分类面板以及热门推荐面板猜你喜欢模块&#xff08;分页查询&#xff09;首页下拉刷新首页骨架屏 配置自定义导航栏 1、创建自定义组件 /index/components/CustomNavbar.vue <script setup l…

关于使用TCP-S7协议读写西门子PLC字符串的问题

我们可以使用TCP-S7协议读写西门子PLC&#xff0c; 比如PLC中定义一个String[50] 的地址DB300.20 地址DB300.20 DB块编号为300&#xff0c;偏移量【地址】是30 S7协议是西门子PLC自定义的协议&#xff0c;默认端口102&#xff0c;本质仍然是TCP协议的一种具体实现&#xff…

ForceField Effects

支持HDRP、URP和LWRP 完全可定制和优化的ForceField VFX Pack。我们使所有着色器和材质都非常易于调整,因此您可以非常轻松地创建自己独特的效果。几乎每个参数都可以调整。所有这些效果都适合于每个游戏,无论是风格化还是现实主义的。该软件包还附带一系列颜色渐变,可用于更…

力扣-20 有效的括号详解 Java

目录 1.题目分析 2.基础知识储备 2.1 哈希表 2.2 栈的存取 3. 逻辑概要 4.源码 示例 1.题目分析 为了对比都是从内而外&#xff0c;一个个匹配&#xff0c;全部匹配成功即为有效字符 2.基础知识储备 2.1 哈希表 简单来说&#xff0c;keyvalue存储 &#xff0c;通过key…

ideaSSM 高校公寓交流员管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 高校公寓交流管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&…

一篇文章搞懂并设计循环队列

目录 1.为什么使用循环队列 2. 循环队列组成 为什么要只使用size-1 个空间存储&#xff1f; 3.循环队列的元素进出 3.1 队尾加入元素 3.2 队头删除元素 3.3 取出队头元素 3.4 取出队尾元素 1.为什么使用循环队列 “假溢出”——》 出队列会空出存储空间&#xff0c;无法…

Gogs - 一款极易搭建的自助 Git 服务

Gogs - 一款极易搭建的自助 Git 服务 1. 使用文档References Gogs https://gogs.io/ https://github.com/gogs/gogs Gogs (/gɑgz/) 项目旨在打造一个以最简便的方式搭建简单、稳定和可扩展的自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发&#xff0c;并…

模拟-算法

文章目录 替换所有的问号提莫攻击Z字形变换外观数列数青蛙 替换所有的问号 算法思路&#xff1a; 从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;就遍历 a ~ z 去尝试替换即可。 class Solution {public String modifyString(String s) {char[] ss s.toCharA…

最近公共祖先(LCA)

祖孙询问 给定一棵包含 n 个节点的有根无向树&#xff0c;节点编号互不相同&#xff0c;但不一定是 1∼n。 有 m 个询问&#xff0c;每个询问给出了一对节点的编号 x 和 y&#xff0c;询问 x 与 y 的祖孙关系。 输入格式 输入第一行包括一个整数 表示节点个数&#xff1b; …

基于YOLOv8深度学习的橙子病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分类

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【MySQL】复合查询——基本单表查询、多表查询、自连接、子查询、使用from进行子查询、合并查询

文章目录 MySQL复合查询1. 基本单表查询2. 多表查询3. 自连接4. 子查询4.1 单行子查询4.2 多行子查询4.3 多列子查询4.4 使用from进行子查询 5. 合并查询5.1 union5.2 union all MySQL 复合查询 数据库的复合查询是指在一个查询中结合使用多个查询条件或查询子句&#xff0c;以…

java多线程编程面试题总结

一些最基本的基础知识就不总结了&#xff0c;参考之前写的如下几篇博客&#xff0c;阅读顺序从上到下&#xff0c;依次递进。 java 多线程 多线程概述及其三种创建方式 线程的常用方法 java 线程安全问题 三种线程同步方案 线程通信&#xff08;了解&#xff09; java 线程池…

CSS案例-2.简单版侧边栏练习

效果 知识点 标签显示模式 块级元素 block-level 常见元素:<h1>~<h6>、<p>、<div>、<ul>、<ol>、<li>等。 特点: 独占一行长度、宽度、边距都可以控制宽度默认是容器(父级宽度)的100%是一个容器及盒子,里面可以放行内或者…

spring注解驱动系列--AOP探究二

上篇中记录了AnnotationAwareAspectJAutoProxyCreator的创建以及注册&#xff0c;主要是 1、EnableAspectJAutoProxy 注解会开启AOP功能 2、然后这个注解会往容器中注册一个AnnotationAwareAspectJAutoProxyCreator组件。 3、之后在容器创建过程中&#xff0c;注册后置处理器&a…

【免费】【随机优化】智能配电网的双时间尺度随机优化调度

目录 1 主要内容 2 部分代码 3 部分程序结果 4 下载链接 1 主要内容 该程序为文章《Two-Timescale Stochastic Dispatch of Smart Distribution Grids》的源代码&#xff0c;主要做的是主动配电网的双时间尺度随机优化调度&#xff0c;该模型考虑配电网的高效和安全运行涉及…

【大模型】在VS Code(Visual Studio Code)上安装中文汉化版插件

文章目录 一、下载安装二、配置显示语言&#xff08;一&#xff09;调出即将输入命令的搜索模式&#xff08;二&#xff09;在大于号后面输入&#xff1a;Configure Display Language&#xff08;三&#xff09;重启 三、总结 【运行系统】win 11 【本文解决的问题】 1、英文不…

【JS】如何避免输入中文拼音时触发input事件

现有一段代码&#xff0c;监听input事件。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" con…

GDC期间LayaAir启动全球化战略

3 月 18 日至 3 月 22 日&#xff0c;一年一度的游戏开发者大会&#xff08;GDC&#xff09;在美国旧金山举行。在此期间&#xff0c;Layabox宣布LayaAir引擎启动全球扩张战略&#xff0c;这标志着引擎将步入快速发展的新阶段。此举旨在利用公司先进的3D引擎技术&#xff0c;将…