0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析图解算法之冒泡排序

Linux爱好者 来源:小K算法 作者:小K算法 2021-06-08 16:43 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

03 冒泡排序 为描述方便,用下面的数组模拟小朋友的交换过程。 核心思想(升序):

从首位置开始,依次比较前后两个数,如果前面的数比后面的数大,就交换两个数。这样第1轮结束后,最大的数就会移动到最后的位置。对剩余元素重复执行N-1次,整个数组有序。因为像空气上浮到水面,最大的元素会慢慢浮到最后,所以冒泡因此得名。

3.1 第1轮 执行完成后,最大的元素归位。

3.2 第2轮 第2轮接着对前面剩余的N-1个元素重复上面步骤,第2大的元素归位。

3.3 第3轮 第3轮对前面剩余的N-2个元素重复上面步骤,第3大的元素归位。 总共执行N-1次操作,所有元素归位。

3.4 代码实现

for (int i = 0; i 《 n - 1; ++i) { for (int j = 0; j 《 n - i - 1; ++j) { if (a[j] 》 a[j + 1]) { swap(a[j], a[j + 1]); } } } 04 问题及优化

4.1 迭代轮次优化 如果原数组为如下情况,那么在执行完第1轮后,整个数组已经有序,后面的轮次没必要执行,可以针对这种情况做一次优化改进。 改进点1: 如果某一轮没有发生过交换,说明数组已经有序,那么以后也不会发生交换,此时可以终止迭代。 代码实现

for (int i = 0; i 《 n - 1; ++i) { // flag标记是否有交换 bool flag = true; for (int j = 0; j 《 n - i - 1; ++j) { if (a[j] 》 a[j + 1]) { swap(a[j], a[j + 1]); flag = false; } } if (flag) { break; } }

4.2 扫描范围优化 如果为以下情况,我们会发现最后的6和8所处的位置和最终排序完成的位置一样,说明过程中他们的位置不会发生变化。 上一轮最后交换的位置,在下一轮时,此位置后面的数也不会再发生交换。 改进点2: 记录每一次最后发生交换的位置,下一轮只需要扫描到此位置的前一个即可。 代码实现

// 记录最后交换的位置 int position = 0; int len = n - 1; for (int i = 0; i 《 n - 1; ++i) { // flag标记是否有交换 bool flag = true; for (int j = 0; j 《 len; ++j) { if (a[j] 》 a[j + 1]) { swap(a[j], a[j + 1]); flag = false; position = j; } } len = position; if (flag) { break; } }

05 总结

冒泡排序是比较简单的一种排序算法,核心思想就是比较相邻的两个数,但效率比较低所以可做一些优化。时间复杂度为O(N^2),数据规模较小时可采用,但数据过大时就不建议采用冒泡了。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7314

    浏览量

    93982
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73148

原文标题:图解算法:冒泡排序

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言的常见算法

    # C语言常见算法 C语言中常用的算法可以分为以下几大类: ## 1. 排序算法 ### 冒泡排序
    发表于 11-24 08:29

    SM4算法实现分享(一)算法原理

    SM4分组加密算法采用的是非线性迭代结构,以字为单位进行加密、解密运算,每次迭代称为一轮变换,每轮变换包括S盒变换、非线性变换、线性变换、合成变换。加解密算法与密钥扩展都是采用32轮非线性迭代结构
    发表于 10-30 08:10

    国密系列算法简介及SM4算法原理介绍

    一、 国密系列算法简介 国家商用密码算法(简称国密/商密算法),是由我国国家密码管理局制定并公布的密码算法标准。其分类1所示: 图1 国家商用密码
    发表于 10-24 08:25

    图解环路设计及控制技术探讨

    由于之前缺乏控制理论方面的知识在刚接触反馈环路的时候对其中的很多名词不是很明白,这次准备采用图解的方法逐一的搞清楚这些名词并且试图找出一种便捷的设置零、极点的方法。最后准备再探讨一下关于控制技术
    发表于 08-22 17:39

    DFT算法与FFT算法的优劣分析

    一概述 在谐波分析仪中,我们常常提到的两个词语,就是DFT算法与FFT算法,那么一款功率分析仪/谐波分析仪采用DFT算法或者FFT算法,用户往往关注的是能否达到所要分析谐波次数的目的,
    的头像 发表于 08-04 09:30 891次阅读

    基于FPGA实现FOC算法PWM模块设计

    哈喽,大家好,从今天开始正式带领大家从零到一,在FPGA平台上实现FOC算法,整个算法的框架如下图所示,如果大家对算法的原理不是特别清楚的话,可以先去百度上学习一下,本教程着重介绍实现过程,弱化原理的介绍。那么本文将从PWM模块
    的头像 发表于 07-17 15:21 3129次阅读
    基于FPGA实现FOC<b class='flag-5'>算法</b><b class='flag-5'>之</b>PWM模块设计

    同步电机失步浅析

    纯分享帖,需要者可点击附件免费获取完整资料~~~*附件:同步电机失步浅析.pdf【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,删除内容!
    发表于 06-20 17:42

    图解单片机功能与应用(完整版)

    过程通道图解、单片机显示电路图解、51单片机按键识别电路图解、51单片机常用算法图解、单片机常用电路图解
    发表于 06-16 16:52

    低成本电源排序器解决方案

    绝大多数负载点DC-DC转换器可以将上一个转换器的电源就绪输出连接至下一个转换器的使能输入,实现上电排序。这种方法只适合比较简单的设计,不能满足多数现代微处理器和DSP的要求一这类器件要求断电顺序必须与上电顺序相反。许多厂商针对这类应用推出了可编程排序IC,但器件价格较为
    的头像 发表于 05-21 09:55 963次阅读
    低成本电源<b class='flag-5'>排序</b>器解决方案

    漫画图解 电感器 抗干扰元器件指南(全彩PDF版)

    漫画图解电感基础知识(高清PDF) 内容:很形象的漫画和语言图解关于电感器的入门基础知识,让电子初学者也能轻松的看懂电子电路。 纯分享贴,有需要可以直接下载附件获取完整资料! (如果内容有帮助可以关注、点赞、评论支持一下哦~)
    发表于 05-13 15:49

    PCB封装图解

    PCB封装图解——详细介绍了各种封装的具体参数,并介绍了如何进行封装制作 纯分享贴,有需要可以直接下载附件获取文档! (如果内容有帮助可以关注、点赞、评论支持一下哦~)
    发表于 04-22 13:44

    110kV变电站典型二次回路图解

    电子发烧友网站提供《110kV变电站典型二次回路图解.pdf》资料免费下载
    发表于 03-31 16:57 5次下载

    无刷电机的绕制和接线方法及实物图解

    下方附件可打开*附件:无刷电机的绕制和接线方法及实物图解.doc
    发表于 03-17 20:00

    详解Linux sort命令掌握排序技巧与实用案例

    在linux系统使用过程中,提供了sort排序命令,支持常用的排序功能。 常用参数 sort命令支持很多参数,常用参数如下:   短参数 长参数 说明 -n – number-sort 按字符串数值
    的头像 发表于 01-09 10:10 1581次阅读

    TimSort:一个在标准函数库中广泛使用的排序算法

    在计算机科学的领域,排序算法是每位学生必学的基础,而排序的需求是每位程序员在编程过程中都会遇到的。 在你轻松调用 .sort() 方法对数据进行排序时,是否曾好奇过,这个简单的方法背后
    的头像 发表于 01-03 11:42 954次阅读