十大经典算法图解(详细版)-程序员宅基地

技术标签: 算法  排序算法  数据结构  

术语铺垫

什么是稳定排序、原地排序、时间复杂度、空间复杂度,先简单解释一下:

1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。

2、非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。

3、原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。

4、非原地排序:需要利用额外的数组来辅助排序。

5、时间复杂度:一个算法执行所消耗的时间。

6、空间复杂度:运行完一个算法所需的内存大小。

十大排序算法讲解

1、选择排序

选择排序
插入排序
冒泡排序
非优化版本
优化版本
希尔排序
归并排序
递归式归并排序
非递归式归并排序
快速排序
堆排序
基数排序
非优化版本
优化版本
桶排序
基数排序
过程简单描述:

首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。其次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法我们称之为选择排序。

选择排序图解如下:

性质:

1、时间复杂度:O(n2)

2、空间复杂度:O(1)

3、非稳定排序

4、原地排序

2、插入排序

我们在玩打牌的时候,你是怎么整理那些牌的呢?一种简单的方法就是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。当我们给无序数组做排序的时候,为了要插入元素,我们需要腾出空间,将其余所有元素在插入之前都向右移动一位,这种算法我们称之为插入排序。

过程简单描述:

1、从数组第2个元素开始抽取元素。

2、把它与左边第一个元素比较,如果左边第一个元素比它大,则继续与左边第二个元素比较下去,直到遇到不比它大的元素,然后插到这个元素的右边。

3、继续选取第3,4,….n个元素,重复步骤 2 ,选择适当的位置插入。

插入排序图解:

性质:1、时间复杂度:O(n2) 2、空间复杂度:O(1) 3、稳定排序 4、原地排序

3、冒泡排序

1、把第一个元素与第二个元素比较,如果第一个比第二个大,则交换他们的位置。接着继续比较第二个与第三个元素,如果第二个比第三个大,则交换他们的位置….

我们对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样一趟比较交换下来之后,排在最右的元素就会是最大的数。

除去最右的元素,我们对剩余的元素做同样的工作,如此重复下去,直到排序完成。

图:

性质:1、时间复杂度:O(n2) 2、空间复杂度:O(1) 3、稳定排序 4、原地排序

优化冒泡排序的算法

假如从开始的第一对到结尾的最后一对,相邻的元素之间都没有发生交换的操作,这意味着右边的元素总是大于等于左边的元素,此时的数组已经是有序的了,我们无需再对剩余的元素重复比较下去了

4、希尔排序

希尔排序可以说是插入排序的一种变种。无论是插入排序还是冒泡排序,如果数组的最大值刚好是在第一位,要将它挪到正确的位置就需要 n - 1 次移动。也就是说,原数组的一个元素如果距离它正确的位置很远的话,则需要与相邻元素交换很多次才能到达正确的位置,这样是相对比较花时间了。

希尔排序就是为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序。

希尔排序的思想是采用插入排序的方法,先让数组中任意间隔为 h 的元素有序,刚开始 h 的大小可以是 h = n / 2,接着让 h = n / 4,让 h 一直缩小,当 h = 1 时,也就是此时数组中任意间隔为1的元素有序,此时的数组就是有序的了。

图:

需要注意的是,对各个分组进行插入的时候并不是先对一个组排序完了再来对另一个组排序,而是轮流对每个组进行排序。

性质:1、时间复杂度:O(nlogn) 2、空间复杂度:O(1) 3、非稳定排序 4、原地排序

5、归并排序

将一个大的无序数组有序,我们可以把大的数组分成两个,然后对这两个数组分别进行排序,之后在把这两个数组合并成一个有序的数组。由于两个小的数组都是有序的,所以在合并的时候是很快的。

通过递归的方式将大的数组一直分割,直到数组的大小为 1,此时只有一个元素,那么该数组就是有序的了,之后再把两个数组大小为1的合并成一个大小为2的,再把两个大小为2的合并成4的 …… 直到全部小的数组合并起来。

图:

性质:1、时间复杂度:O(nlogn) 2、空间复杂度:O(n) 3、稳定排序 4、非原地排序

6、快速排序

我们从数组中选择一个元素,我们把这个元素称之为中轴元素吧,然后把数组中所有小于中轴元素的元素放在其左边,所有大于或等于中轴元素的元素放在其右边,显然,此时中轴元素所处的位置的是有序的。也就是说,我们无需再移动中轴元素的位置。

从中轴元素那里开始把大的数组切割成两个小的数组(两个数组都不包含中轴元素),接着我们通过递归的方式,让中轴元素左边的数组和右边的数组也重复同样的操作,直到数组的大小为1,此时每个元素都处于有序的位置。

图:

性质:1、时间复杂度:O(nlogn) 2、空间复杂度:O(logn) 3、非稳定排序 4、原地排序

7、堆排序

堆的特点就是堆顶的元素是一个最值,大顶堆的堆顶是最大值,小顶堆则是最小值。

堆排序就是把堆顶的元素与最后一个元素交换,交换之后破坏了堆的特性,我们再把堆中剩余的元素再次构成一个大顶堆,然后再把堆顶元素与最后第二个元素交换….如此往复下去,等到剩余的元素只有一个的时候,此时的数组就是有序的了。

图:

性质:1、时间复杂度:O(nlogn) 2、空间复杂度:O(1) 3、非稳定排序 4、原地排序

8、计数排序

计数排序是一种适合于最大值和最小值的差值不是不是很大的排序。

基本思想:就是把数组元素作为数组的下标,然后用一个临时数组统计该元素出现的次数,例如 temp[i] = m, 表示元素 i 一共出现了 m 次。最后再把临时数组统计的数据从小到大汇总起来,此时汇总起来是数据是有序的。

图:

性质:1、时间复杂度:O(n+k) 2、空间复杂度:O(k) 3、稳定排序 4、非原地排序

注:K表示临时数组的大小,下同

9、桶排序

桶排序就是把最大值和最小值之间的数进行瓜分,例如分成 10 个区间,10个区间对应10个桶,我们把各元素放到对应区间的桶中去,再对每个桶中的数进行排序,可以采用归并排序,也可以采用快速排序之类的。

之后每个桶里面的数据就是有序的了,我们在进行合并汇总。

图片:

性质:1、时间复杂度:O(n+k) 2、空间复杂度:O(n+k) 3、稳定排序 4、非原地排序

注:k 表示桶的个数,下同

10、基数排序

基数排序的排序思路是这样的:先以个位数的大小来对数据进行排序,接着以十位数的大小来多数进行排序,接着以百位数的大小……

排到最后,就是一组有序的元素了。不过,他在以某位数进行排序的时候,是用“桶”来排序的。

由于某位数(个位/十位….,不是一整个数)的大小范围为0-9,所以我们需要10个桶,然后把具有相同数值的数放进同一个桶里,之后再把桶里的数按照0号桶到9号桶的顺序取出来,这样一趟下来,按照某位数的排序就完成了

图:

性质:1、时间复杂度:O(kn) 2、空间复杂度:O(n+k) 3、稳定排序 4、非原地排序

总结

用一张图汇总了10大排序算法的性质

————————————————
版权声明:本文为CSDN博主「鹏燕1369」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_23488347/article/details/88808343

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fierce_zhang/article/details/126924159

智能推荐

Python爬虫网页解析神器Xpath快速入门教学!!!_python xpath 等于class的标签-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏18次。文章目录1、Xpath介绍2、Xpath路径表达式3、结合实例讲解1、Xpath介绍 XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。2、Xpath路径表达式表达式描述nodename选取此节点的所有子节点。/从根节点选取。//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。.选取当前节点…选取当前节点的父节点_python xpath 等于class的标签

快手上热门的小技巧,抖音快手直播5个上热门技巧_快手作品上了小热门后应该怎么做-程序员宅基地

文章浏览阅读2.1k次。2020下半年,随着直播带货行业发展势头越来越猛,各大电商平台纷纷涉足直播电商,普通人也跃跃欲试想要加入直播带货,那么普通人该如何选择直播平台呢,这要根据每个人的自身条件,不管做抖音还是快手,初始最重要的就是涨粉,今天小编分享的是新人做抖音快手直播如何快速涨粉的技巧。说到抖音快手涨粉,最暴力的莫过于上热门,一个视频上热门,涨粉可能就有好几万,比如之前有个直播睡觉,一夜爆红的主播,一天时间涨粉几百万,一晚收入70多万,不知道羡煞多少旁人。了解抖音快手上热门的机制是怎样的!抖音快手热门视频推荐机制,或者_快手作品上了小热门后应该怎么做

html输入哪种table好,如何将html转换为Handsontable哪个表还有html输入字段<table> </table>...-程序员宅基地

文章浏览阅读94次。我想显示一个动态表,其中包含来自自定义搜索的记录。现在我想将表格行设为内联可编辑行。我还需要对表进行分页,因为我需要在同一个表上显示30到40个表列(滚动列)。我使用Handsontable来实现这一点,如下图所示,但是,图像不会像我在表格单元格中输入一样。Scroll - HandsontableActionIDNameAddress1testtest2test2test23test3test3..._html版 handsontable

如何用python生成带图片名称和标签的.txt文件(代码)_将标注信息按指定格式制作图片对应的txt标签数据。-程序员宅基地

文章浏览阅读1.6w次,点赞23次,收藏147次。我们之前实现了如何用python批量修改图片的名称,不清楚的同学可以看一下这一篇:python批量修改一个文件夹下含多个文件夹中的所有图片名称(代码)接下来我们来看一下如何生成带图片名称和标签的txt文件因为我们在用caffe进行分类训练时,不管是生成imdb还是直接拿图片训练,都是需要标签文件的话不多说,直接上代码:#!/usr/bin/python# -*- co..._将标注信息按指定格式制作图片对应的txt标签数据。

如何设置EXCEL表格单元格的内容可以换行显示_电脑里面的文本控制自动换行在哪里-程序员宅基地

文章浏览阅读1.6k次。点击单元格,选择“设置单元格格式”,然后选择“对齐”,在“文本控制”中勾选“自动换行”就可以了,当然你也可以选择水平对齐和垂直对齐的“居中”哦。..._电脑里面的文本控制自动换行在哪里

虚拟机安装Mac Ox 10.6 之后的驱动安装vmware tool 安装_苹果笔记本装虚拟机后设备驱动也是虚拟吗-程序员宅基地

文章浏览阅读2.3k次。在虚拟机上成功安装Mac OX 10.6 系统之后,还有一些的需要的驱动。在安装vmare tool , 在启动界面,将setting->CD/DVD(IDE)选项中drawin.iso, 将上面的对话框connect 选中,之后会在系统的桌面上看到VMware Tool( Drawin) , 双击进去,直接双击Install VMware tools, 之后就可以的,重新启动,如下图所示_苹果笔记本装虚拟机后设备驱动也是虚拟吗

随便推点

Multi-Instrument中 VT XLR-to-USB使用探头的选择_vtxlr-程序员宅基地

文章浏览阅读320次。就是探头看到说明书上说1,2,3分别对应VTXLR-to-USB的hi,med,lo.我看到当我软件中探头和硬件VTXLR-to-USB开关没对应的时候,也是有输入的,这种情况下测试是对的吗1.探头看到说明书上说1,2,3分别对应VTXLR-to-USB的hi,med,lo.我看到当我软件中探头和硬件VTXLR-to-USB开关没对应的时候,也是有输入的,这种情况..._vtxlr

Django搜索功能的实现_django做搜索功能-程序员宅基地

文章浏览阅读9.1k次,点赞4次,收藏44次。在用Django搭建网站的时候,要实现一个搜索功能,实现对数据库的检索功能,这里用到了网上的几个标准库: django-haystack, whoosh, jieba。其中这里有详细的haystack中文教程1 首先是在相应的环境中安装,pip install 上面这三个。这个是默认安装anaconda的环境里,当然你也可以安装到自己的虚拟环境中。2 进行配置,首先是在Django的se..._django做搜索功能

基于Vue前端UI框架比较_antdesignvue和vue的区别-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏7次。基于Vue前端UI框架比较Vue3相对于vue2的优缺点优点:性能提升,主要体现在打包体积(减少了40%左右),渲染速度(快了55%),更新速度(100%)及内存使用(减少了50%)几方面。 由于增加了composition api,更加支持Ts,使得代码相对于Vue2更利于维护。缺点:就目前来说用户数量和社区活跃度没有vue2高,有一定的学习成本(包括学习ts)各个UI框架的比较根据目前市场常用的框架进行初步筛选,入选了4款框架,分别为element-ui, ant-desi_antdesignvue和vue的区别

会议论文出版地和出版者_论文中会议的出版者怎么写-程序员宅基地

文章浏览阅读5.7k次,点赞9次,收藏7次。国内的期刊和毕业论文写作格式要求在参考文献中会议论文一律以论文集的形式著录,需注明论文集的出版地、出版者和出版年,但是国外论文的参考文献中一般不会标注论文集的出版地和出版社,他们只标注会议的举行时间和地点。为了满足毕业论文的格式要求,整理了常见计算机领域论文集的出版者及其出版地。出版者:出版地Internet Society: Rosten, VA, USASpringer: Berlin,GermanACM:New York, NYIEEE:Piscataway, NJUSENIX:Berk_论文中会议的出版者怎么写

spark-sql实现Kudu同步数据到mysql_sparksql 数据同步-程序员宅基地

文章浏览阅读1.7k次。Kudu同步数据到mysql实施方案简介目前kudu导出到mysql没有比较好的方案,临时借助spark-sql进行数据导出,处理逻辑是会把老的数据给删除再导入,已经完成了生产环境的上线。需要传入的参数程序参数 参数序号 字段含义 备注 1 同步的source表(含schema),必选 ..._sparksql 数据同步

Linux基础:xargs命令-I选项使用技巧_xargs -i-程序员宅基地

文章浏览阅读1.1w次,点赞3次,收藏17次。这篇文章使用具体示例来介绍一下xargs命令-I参数的常见使用方法。_xargs -i