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

    文章

    6867

    浏览量

    88800
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68324

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

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

收藏 人收藏

    评论

    相关推荐

    技术科普 | 芯片设计中的LEF文件浅析

    技术科普 | 芯片设计中的LEF文件浅析
    的头像 发表于 11-13 01:03 125次阅读
    技术科普 | 芯片设计中的LEF文件<b class='flag-5'>浅析</b>

    时间复杂度为 O(n^2) 的排序算法

    作者:京东保险 王奕龙 对于小规模数据,我们可以选用时间复杂度为 O(n2) 的排序算法。因为时间复杂度并不代表实际代码的执行时间,它省去了低阶、系数和常数,仅代表的增长趋势,所以在小规模数据情况下
    的头像 发表于 10-19 16:31 1016次阅读
    时间复杂度为 O(n^2) 的<b class='flag-5'>排序</b><b class='flag-5'>算法</b>

    TPS54120排序和跟踪

    电子发烧友网站提供《TPS54120排序和跟踪.pdf》资料免费下载
    发表于 10-10 10:54 0次下载
    TPS54120<b class='flag-5'>排序</b>和跟踪

    手把手教你排序算法怎么写

    今天以直接插入排序算法,给大家分享一下排序算法的实现思路,主要包含以下部分内容:插入排序介绍插入排序
    的头像 发表于 06-04 08:03 640次阅读
    手把手教你<b class='flag-5'>排序</b><b class='flag-5'>算法</b>怎么写

    音箱制作过程图解

    电子发烧友网站提供《音箱制作过程图解.doc》资料免费下载
    发表于 04-28 09:27 10次下载

    用FPGA实现双调排序的方法(2)

    典型的排序算法包括冒泡排序、选择排序、插入排序、归并排序
    的头像 发表于 03-21 10:28 602次阅读
    用FPGA实现双调<b class='flag-5'>排序</b>的方法(2)

    FPGA实现双调排序算法的探索与实践

    双调排序(BitonicSort)是数据独立(Data-independent)的排序算法,即比较顺序与数据无关,特别适合并行执行。在了解双调排序
    发表于 03-14 09:50 548次阅读
    FPGA实现双调<b class='flag-5'>排序</b><b class='flag-5'>算法</b>的探索与实践

    想听听48和大对数光缆的排序

    48芯光缆和大对数光缆都是光缆中的一种,它们的区别在于芯数不同。48芯光缆指的是光缆中包含48根光纤,而大对数光缆则是指光缆中芯数超过了48芯。 在实际的光缆应用中,不同芯数的光缆需要进行不同的排序
    的头像 发表于 03-12 10:44 550次阅读

    C语言实现经典排序算法概览

    冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小、首字
    的头像 发表于 02-25 12:27 421次阅读
    C语言实现经典<b class='flag-5'>排序</b><b class='flag-5'>算法</b>概览

    FPGA图像处理CLAHE算法

    在FPGA图像处理--CLAHE算法(一)中介绍了为啥要用CLAHE算法来做图像增强。
    的头像 发表于 01-04 12:23 2386次阅读
    FPGA图像处理<b class='flag-5'>之</b>CLAHE<b class='flag-5'>算法</b>

    十大排序算法总结

    排序算法是最经典的算法知识。因为其实现代码短,应该广,在面试中经常会问到排序算法及其相关的问题。一般在面试中最常考的是快速
    的头像 发表于 12-20 10:39 1078次阅读

    断路器控制回路接线图解

    断路器控制回路接线图解
    的头像 发表于 12-16 09:37 1928次阅读
    断路器控制回路接线<b class='flag-5'>图解</b>

    保护器件过电应力失效机理和失效现象浅析

    保护器件过电应力失效机理和失效现象浅析
    的头像 发表于 12-14 17:06 736次阅读
    保护器件过电应力失效机理和失效现象<b class='flag-5'>浅析</b>

    时间复杂度为O (nlogn)的排序算法简述

    归并排序遵循分治的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解。
    的头像 发表于 12-05 09:57 556次阅读
    时间复杂度为O (nlogn)的<b class='flag-5'>排序</b><b class='flag-5'>算法</b>简述

    使用LTC2937排序和监督的分步指南

    电子发烧友网站提供《使用LTC2937排序和监督的分步指南.pdf》资料免费下载
    发表于 11-24 14:39 0次下载
    使用LTC2937<b class='flag-5'>排序</b>和监督的分步指南