首页 > 编程知识 正文

八种排序算法效率比较(常见排序算法)

时间:2023-05-03 16:52:45 阅读:85546 作者:4283

资料来源:首席自夸官(ID:ITman-99 ) )。

编辑:小妮子

几年前,pony在腾讯产品和技术峰会上说:“我们期望的产品经理是从技术上晋升的。” 技术是实施手段,产品最终必须通过技术实现,产品还是不能脱离技术。

那么,由于不想用无聊的代码来理解一些大的排序算法,本文利用动态可视化图来分析泡沫排序、选择排序、插入排序。

排序算法的最终目的是使无序的数据组合成为有序的数据组合。

一、冒泡法

正如文字所示,可以理解为“冒泡”,即小值浮动,大值下沉。

1. 冒泡排序法基本思路

第一步比较相邻元素的大小。 如果第一个大于第二个,则交换两个元素的位置。

然后,从第一对到最后一对,对每个相邻元素对执行相同的操作。 在这方面,最后的要素应该是最大的数量。

除最后一个外,对所有元素重复上述步骤。

对越来越少的元素重复上述步骤,直到没有需要比较的数字对为止。

首先,以文字的形式一步步进行案例的分解。

以[ 20,10,15,30,12 ]这个序列为例。

第一遍循环

检查是否为20 10是的,更换元件的位置;

20检查15是否是的,更换元件的位置;

20检查30是否不,不更换地方;

检查是否为30 12是,更换元件的位置;

第一个循环结束,未排序的最后一个元素被标记为已排序(即30 )。 最近的扫描至少有一次更换,因此可以进行其他扫描。 在这个轮扫描中,只循环判断前面的四个要素。

第二个循环开始

检查10是否大于15不,不更换地方

检查15是否大于20。不,不更换地方

检查20是否大于12是,更换元件的位置;

由于此时“20”被标记为已排序,因此同样在下一次循环遍历中循环判定前三个要素即可。

…。

为了避免视觉疲劳,文字只说明前两个循环,后三个循环大家自己思考理解。

2. 冒泡排序法全流程

3. 冒泡法总结

比较两两个各回合左右的元素,不进行元素间的比较

按周期进行比较,将生成当前最大值(当前最大值)此次最大值)

由于每次循环结束时都会生成当前的最大值,因此每个循环只需要比较一个元素

二、选择排序法

selectsortingsorting是从泡沫排序演变而来的,在各回合的比较中得到最小值,并依次与各回合的“无序区”中参加比较的第一个值进行交换。

1. 选择排序法基本思路

初始时在序列中查找最小的元素

作为排序序列放置在序列的开头

然后,从剩余的未排序元素中继续查找最小元素,并将其放置在排序序列的末尾

这样,直到所有元素都被排序

请注意选择排序和气泡排序的区别:

气泡排序通过依次替换两个相邻顺序不正确的元素位置,将当前最大元素放置在适当的位置,从而在每个循环中记住当前最小元素的位置,最后只需进行一次更换操作就可以放置在适当的位置。

同样,让我们以[ 20,10,15,30,12 ]这个数组为例。

第一遍循环

首先将最小值设定为20,通过遍历未排序的剩余元素来查找真正的最小值

检查10是否小于当前最小值(20 )。 是的,将10设为新的最小值;

检查15是否小于当前最小值(10 )。 不,10还是最小值

检查30是否小于当前最小值(10 )。 不,10还是最小值

检查12是否小于当前最小值(10 )。 不,10还是最小值。

转一圈后,最小值出现了。

更换最小的元素(10 )和未排序的第一个元素) 20 )。

目前,10被认定为整个序列中最小值。

8702340250250c7f48?from=pc">

第二遍循环

把现在的最小值设置成为 20 , 然后通过遍历剩下的没有排序过的元素来找到真正的最小值;

检查是否 15 小于现在的最小值 (20)。是,将 15 设为新的最小值;

检查是否 30 小于现在的最小值 (15)。否,15仍然是最小值;

检查是否 12小于现在的最小值 (15)。是,将 12 设为新的最小值;

交换最小的元素 (12) 和第一个没有排序过的元素 (20);

数组排序顺序更新为 10 12 15 30 20。

2. 选择排序法全流程

3. 选择排序法总结

每一轮进行跨元素比较

每一轮循环比较都会产生当前最小值(当前最小值:这一轮下来的最小值)

每一轮循环比较后就会少一个元素进行比较(因为每结束一轮就会产生一个当前最小值)

三、插入排序法(直接插入)

插入排序是基于互相比较的排序。所谓的“比较”,就是通过比较数组中的元素,看谁大谁小,根据结果对应调整元素的位置。

1. 插入排序法基本思路

初始时先默认将第一个元素标记为已排序

然后提取第一个没有排序过的元素,找出插入提取元素的地方并和已经排序过的元素进行比较。

比较大小若条件成立,则将已排序过的元素往右移1个单位,如果条件不成立,则在现有位置直接插入。

以此类推,直到所有元素均排序完毕

还以[20,10,15,30,12]这个数组举例

将第一个元素 (20) 标记为已经排序过;

提取第一个没有排序过的元素 (10);

找出插入提取元素的地方;和已经排序过的元素 20 比较;

20 大于 10 成立, 则将现在已经排序过的元素20向右移动1格;

在数组的最开始(没有东西可以比较),则在现有位置上插入元素。

提取第一个没有排序过的元素 (15);

找出插入提取元素的地方;和已经排序过的元素 20 比较;

20 大于 15 成立, 则将现在已经排序过的元素20 向右移动1格;

10 大于 15 不成立, 在现有位置上插入一个元素;

提取第一个没有排序过的元素 (30);

找出插入提取元素的地方;和已经排序过的元素 20 比较。

20 大于 30 不成立, 在现有位置上插入一个元素;

提取第一个没有排序过的元素 (12)。

……..

避免篇幅过大导致视觉疲劳,下面几步大家进行自我思考和理解。

2. 插入排序法全流程

3. 插入排序法总结

由“有序组”和“待插入组”组成

每一轮都有一个待插入对象(可以接收实时数据进行排序)直到“待插入组元素为0”

除了以上三种排序算法,还有许多不同的排序算法,每个都有其自身的优点和使用场景,当然也有局限性。可以多看几遍全流程动态图弄清来龙去脉,理解性地记忆,希望对你有用。

前自带bug程序员,现不知名产品经理,随缘更新~

欢迎留言

本文由首席吹牛官(ID:ITman-99)原创发布,授权互联网早读课转载。内容仅代表作者独立观点,不代表早读课立场。如需转载,请联系原作者。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。