图解冒泡排序

简介: 本文通过图解的方式介绍冒泡排序算法,帮助读者更直观地理解其工作原理和实现过程。

一.什么是冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

  • 时间复杂度:O(n²)

  • 算法稳定性:稳定排序算法

  • 实 质:把小(大)的元素往前(后)调

  • 思想: 交换思想

  • 原理:

    • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    • 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    • 针对所有的元素重复以上的步骤,除了最后一个。
    • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
  • 图解:(参考《Java数据结构和算法》书籍上的图片)

    • 未排序的一行人:

      image-20210826221105258-1629987068544

    • 从第一个人开始与第二个人进行比较,矮的站前面,高的继续和后面的人比,直到最后一人成为最高的,那么第一轮比较结束

      在这里插入图片描述

      image-20210826222703603

    • 然后第二轮继续比较,从第一个人开始依次比较,注意本轮不需要和最后一人(最高的)进行比较了,将第二高的人排在了倒数第二的位置,本轮结束。后续按照此规则继续比较,直到整个队列从小到大排序。如下:

      image-20210826222747767

二. 逻辑推演

现有一个数组,里面的数据为: [11,17,28,34,67,48,47,66],我们以此数据来分析:

第一轮比较:

原始数据排列情况如下:

image-20210827141708676

我们冒泡排序比较是从第一个元素开始进行,然后和第二个元素进行比较,由于11和17比较,11比17小,不需要交换;因此!紧接着应该由17和28进行比较,这时发现17比28小,位置继续保持不变!

image-20210827141851245

接下来继续由28和34进行比较:

image-20210827141956689

发现依然不变,继续让34和67进行比较:

image-20210827142030370

34比67小,依然不变。继续:

image-20210827142054635

当67和48比较的时候,由于67比48大!因此两者交互了!

image-20210827142117667

接下来:67和47进行比较,67比47大,继续交换:

image-20210827142152409

最后,67和66继续比较,发现67更大,那么继续完成交换:

image-20210827142224809

小结:

通过第一轮 7 次比较,最终将最大值交换到了最右边!

第二轮比较:

依然从第一个数进行比较,将第二大的数给排序到右边去:

image-20210827142627534

第三轮:

排序后的结果:

image-20210827142850766

第四轮:

image-20210827142909401

第五轮:

image-20210827142920676

第六轮:

image-20210827142930722

第七轮:

image-20210827142938508

总结:

第一轮比较7次

第二轮比较6次

第三轮比较5次

...

第七轮比较1次

目录
相关文章
|
编解码 openCL TensorFlow
RK3568开发笔记(一):瑞芯微RK3568芯片介绍,入手开发板的核心板介绍
RK3568开发笔记(一):瑞芯微RK3568芯片介绍,入手开发板的核心板介绍
RK3568开发笔记(一):瑞芯微RK3568芯片介绍,入手开发板的核心板介绍
|
7月前
|
API 调度 决策智能
全新平台级 ModelScope MCP 实验场重磅上线!
还在为快速验证MCP在对话中的效果而烦恼? 希望更灵活地组合魔搭开源模型API-Inference与Hosted MCP服务?
429 2
LabVIEW使用VI脚本向VI添加对象
LabVIEW使用VI脚本向VI添加对象
296 2
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
1044 113
|
存储 缓存 自然语言处理
浏览量超 10w 的热图,描述 RAG 的主流架构
大模型性能的持续提升,进一步挖掘了 RAG 的潜力,RAG 将检索系统与生成模型相结合,带来诸多优势,如实时更新知识、降低成本等。点击本文,为您梳理 RAG 的基本信息,并介绍提升大模型生成结果的方法,快一起看看吧~
1494 108
|
芯片
IMX6ULL平台的I2C
IMX6ULL平台的I2C
433 0
IMX6ULL平台的I2C
|
存储 数据安全/隐私保护 数据中心
Incus 6.4 容器和虚拟机管理器发布
【10月更文挑战第26天】
608 2
Incus 6.4 容器和虚拟机管理器发布
|
存储 安全 算法
|
Java API Android开发
你有没有想过自己写一个Xposed模块?教程来了~(一)
在互联网上,关于Xposed模块编写的教程可谓是一抓一大把。但由于时间的推移,很多工具和方法都发生了变化(如Eclipse退出安卓编程舞台,AndroidStudio 不断升级导致其一些设置也随之变化等)也正因此,网上的教程往往有一些时限性,比如现如今 provide 这个关键字已经被舍弃了却仍有人在用,还有些说要把jar包放到lib文件夹而非libs文件夹……种种错误或者落伍的教程对新手产生了很大的误导。
708 0
计算机网络——数据链路层-媒体接入控制-静态划分信道(频分复用FDM、时分复用TDM、波分复用WDM、码分复用CDM)
计算机网络——数据链路层-媒体接入控制-静态划分信道(频分复用FDM、时分复用TDM、波分复用WDM、码分复用CDM)
1370 1