图解冒泡排序

【排序】图解冒泡排序 冒泡排序 一、思想 对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟都会将最小或最大的元素交换的顶端,最终达到完全有序,例如,升序排列,就是最大的元素移动后面的过程。 二、图解过程 冒泡排序升序排列的整个过程如下图,数组共包含6个元素,第一轮将6个元素中最大的元素“11”交换至数组的最后;第二轮将剩下5个元素中的最大元素“8”交换至“11”的前面。依次执行,直到所有的元素比较完成。... 阅读详情

本文来自于“涛声依旧”的投稿,微信公众号“码分享”,老刘做了部分修改。

冒泡排序是一个比较经典和简单的排序算法,今天我们从从算法本身,时间复杂度以及稳定性方面来看看冒泡排序,这些方面也是研究其他排序算法的一般思路

冒泡思想

在算法国内,相传有一位算法大师,他不喜做官,一心只在民间传道受业,弟子三千,人称“Bill大师”。

有一天,Bill大师带着新收的弟子张大胖去溪边游玩,看到许多大大小小的石头在溪边,他灵机一动,就拿起了四个大小不同的石子,摆成一行:0?wx_fmt=png

Bill大师问:“大胖,你如何将这些石子按照从小到大的顺序从左到右依次排列成一行?”

“先找出最大的放在右边,然后再找出次大的,放在最大的左边,按照这个规律就可以依次排好了”,大胖不假思索地回答道。

“那你如何找到最大的呢?”

“用肉眼看”,大胖弱弱地说了一句。

“蠢材,怎么可以用肉眼看,如果成千上万你也用肉眼看吗?咱们算法国以算法著称,就是让一切问题的解决都可以最终化为一个算法,可以用程序写出来!” Bill严厉地批评道。

“那该如何找最大的呢?” 大胖问道

“你看那水中的鱼,他们时不时地吐出泡泡,那泡泡越往上走就会越大,我们可以借鉴这种思路啊。”

0?wx_fmt=jpeg

“从第一个石子开始,让它和右边相邻的石子进行比较,如果左边的石子大于右边的石子,那么就交换两个石子的位置,(也可以左小于右交换,这里采用大于交换),这样每比较一次,大的就跑到右边,直到跑到最右边”,Bill说道。

Bill看大胖不明白,解释道:“起始时,左下标指向第一个石子,右下标指向第二个石子,然后比较”,说着说着画了一个图

0?wx_fmt=png

“然后左右下标同时向右移动,再次比较”,Bill接着说道,手不停的画着

0?wx_fmt=png

“这样一来,每次比较完,右下标指向的石头就是已经比较过的元素中的最大元素”,Bill微微笑了一下,然后又画了一个图:0?wx_fmt=png

“按照这个做法,这一趟下来所有石子中最大的就跑到最右边了”,大胖悟出了其中的真谛,接着老师的话说了一句,自己在地上也画了一个图:0?wx_fmt=png

“这是第一趟排序,经过这趟排序之后,最大的就在最右边了,也就是排好序了,那么接下来就从剩下的三个石子中选最大的了,规则就和上面的一样了”,大胖继续说道,并画了一个图:

0?wx_fmt=png

Bill脸上露出满意的笑容。接着问道:“如果有 N 个石子,称从左到右找最大为一趟,那么要排好序需要多少趟?”

大胖想了想,说道:“需要N-1次,因为如果因为N-1个数都排好了,那么最后一个数也就不用排了”,顺便画了一个图演示刚才四个石子的情况

0?wx_fmt=png

冒泡代码

“那你能把这个过程用代码实现吗?”,Bill问道。

“这个......”,大胖挠了挠头,傻傻地笑了一下,Bill不满地看了新徒弟一眼,只好自己写了,只见他飞速地写了短短的几行代码:

0?wx_fmt=png


大胖心中暗暗惊叹老师的功力。

“这个第一层循环是控制趟数,第二行能具体讲讲吗?”,大胖再次挠了挠头。

“第二层就是控制你第 i+1趟(因为i从0开始)所比较的次数,第 i +1 趟比较了 n - 1 -i 次”,Bill说道,最后画了两张图。

0?wx_fmt=png

0?wx_fmt=png

“随着趟数的增加,比较的次数也随之减小,这个规律很容易发现吧!”,Bill说道。

张大胖点了点头,明白了。

时间复杂度

“那你说说这个算法的时间复杂度吧。”,Bill问道。

张大胖心说好不容易跟着老师出来一次,本想游山玩水,没想到这么多问题! 他不敢怠慢,赶紧盘算起来:

4个石子,排序完需要3趟,第一趟需要比较3次,第二趟需要比较2次,第三趟需要比较1次,那一共比较了 3 + 2 + 1 次。

那推广到数量为 n 的规模的话,那就需要 (n-1) + (n-2) +...+2+1 次,这不就是一个等差数列吗,很显然:

0?wx_fmt=png

根据复杂度的规则,去掉低阶项(也就是n/2),并去掉常数系数,那复杂度就是O(n^2)了

“O(n^2)”,大胖想了一会说道。

“恩恩,不错,孺子可教。” Bill赞赏到,心想这小子数学还不错。

稳定性

“那这个算法稳不稳定呢?”,Bill又问道。

“哦? 什么是稳定性?”

奥,这个还没有给他讲过,Bill忽然想起来。

“所谓稳定性,其实就是说,当你原来待排的元素中间有相同的元素,在没有排序之前它们之间有先后顺序,在排完后它们之间的先后顺序不变,我们就称这个算法是稳定的”,Bill说道,顺便画了一个图举了一个例子

0?wx_fmt=png

“看到了吧,原本同样大的石子,蓝色的在绿色的左边,拍完序后蓝色的仍然在绿色的左边,这就是稳定的”,Bill解释道。

“哦,我懂了,那冒泡排序就是一个稳定的排序了,因为在交换的时候,如果两个石子相同,那么就不交换[if (arr[j] > arr[j+1]){ 交换}],相同元素不会因为算法中哪条语句相互交换位置的。”

“恩,对的”,Bill说道。

天色渐晚,Bill和弟子准备回去,张大胖问道:“老师,这个排序算法是不是叫做冒泡排序?”

Bill说:“没错,很形象吧? 对了大胖,我今天发现你的理论基础不错,一点就透,但是编码功底太差,以后要多加练习啊,不要成为一个眼高手低的人啊。”

“谨遵老师教诲!我一定多加练习!”

(完)

你看到的只是冰山一角, 更多精彩文章,请移步《2016文章精华》或者《2017上半年文章精华》


码农翻身

用故事讲述技术

0.jpeg

冒泡排序 图解+python实现 冒泡排序就是重复’从序列右边(或左边)比较两个数字的大小,再根据结果交换两个数字的位置‘这一操作的算法。在这个过程中,数字会像泡泡一样,慢慢从右往左(从左到右)浮到序列的顶端,所以这个算法被称为冒泡排序。时间复杂度为。 图解算法,以从右边开始比较为例。 代码实现: import numpy as np #从左边开始比较 def leftBubbleSort(arr): for i in range(len(arr)-1): for j in range(le.. 阅读详情

相关推荐

ADS 2013安装教程

1.2013和2014安装过程是一样的,运行ads2013_06_shp_windows文件进行安装 2.点击“NEXT”。 3.选择I accept,然后点击“NEXT”。 4.选择“complete”,然后点击“NEXT”。 5.选择安装路径,最好默认安装路径,安装路径不要有中文,然后点击“NEXT”。 6.点击“NEXT”. 7.如下路径默认安装,然后点击“NEXT”。 8.点击“NEXT”。 ...

谢谢关注“小鱼教你模数电”,各平台同号 6009

排序算法(2)冒泡排序

冒泡排序分从大到小和从小到大两种排序方式。它们的唯一区别就是两个数交换的条件不同,从大到小排序是前面的数比后面的小的时候交换,而从小到大排序是前面的数比后面的数大的时候交换。我这里只说 从小到大的排序方式。 冒泡排序的原理:从第一个数开始,依次往后比较,如果前面的数比后面的数大就交换,否则不作处理。这就类似烧开水时,壶底的水泡往上冒的过程。 一、 图解分析 现以数组[8,7,6,4,5]为...

weixin_44033440的博客 4134

从ATE到ATPG:基于Scan Chain的芯片制造缺陷定位实战解析

本文深入解析了从ATE到ATPG的芯片制造缺陷定位实战技术,重点介绍了Scan Chain的工作原理、异步复位触发器处理技巧以及Design Compiler中的DFT实现方法。通过实际案例展示了如何利用ATE测试数据和ATPG工具进行精确的缺陷定位,并分享了提升测试覆盖率和优化测试成本的专业技巧,为芯片测试工程师提供了宝贵的实战经验。

weixin_42527160的博客 380

排序算法之冒泡排序(图解)

排序算法之冒泡排序(图解)

Sueko的博客 5万+

SpringBoot Redis入门(一)——redis、Lettuce、Redisson使用

Lettuce是SpringBoot自带的Redis客户端,性能比Redis要好, 是线程安全的,支持同步编程,异步编程,响应式编程,自动重新连接,主从模式,集群模块,哨兵模式Redisson 是一个在 Redis 的功能基础上实现的 Java 驻内存数据网格客户端。实现了分布式和可扩展的 Java 数据结构,提供很多分布式相关操作服务,例如分布式锁,分布式集合,可通过 Redis 支持延迟队列。

朗朗的博客 3833

Qt C++:跨平台开发利器

摘要: Qt C++是基于C++的跨平台开发框架,通过元对象系统、信号槽机制及模块化架构实现"一次编写,多端部署"。核心特性包括: 跨平台能力:覆盖桌面(Windows/macOS/Linux)、移动端(iOS/Android)、嵌入式及WebAssembly; 信号与槽:替代传统回调,实现对象间高效通信; UI组件库:200+预制组件支持QSS样式定制; 工具链:Qt Creator集成开发环境提供可视化设计、调试及多平台编译。 广泛应用于工业控制、车载系统、医疗设备及跨平台应用开发,

2202_75382767的博客 1682

【排序算法】图解冒泡排序(多图+解决两种无效比较问题)

本文主要介绍冒牌排序算法,通过图片一步步解释每一趟每一次的交换。并且,本文在给出冒泡排序基础版代码后,分析了基础版存在的两个问题,解决该问题可以避免出现不必要的比较。代码通过C#实现,并输出每一次交换的情况和比较次数,方便各位小伙伴比较算法的优缺点。......

baidu_33146219的博客 2万+

SPSS(二)SPSS实现多因素方差分析模型(图文教程+数据集)

SPSS(二)SPSS实现多因素方差分析模型 单因素方差分析上一篇博客https://blog.youkuaiyun.com/LuYi_WeiLin/article/details/89917656已经介绍完毕 这篇博客我们主要来学习多因素方差分析 多因素方差分析,就是同时考虑若干个控制因素的情况下,分别分析它们的改变是否造成观察变量的显著变动 (多个自变量,一个因变量)自变量类型以分类变量为主也可以...

可乐联盟 6万+

【十大排序算法】----冒泡排序(详细图解分析+实现,小白一看就会)

的原理是:从序列的第一个元素开始,比较相邻的两个元素,如果它们的顺序错误(如:从大到小排序时,前一个元素大于后一个元素),则交换它们的位置。继续比较下一对相邻元素,执行相同的操作,直到序列的末尾。找出最大的(即整个数组中第二大的数)并把它放在倒数第二位......这样一轮一轮的比较,直到只剩下一个数时(完成了N趟的排序)这个排序就完成了,从而实现从小到大的排序。因此,总的迭代次数 = (N−1)+(N−2)+...+1 = N*(N−1)/2。五:冒泡排序——效率(时间复杂度)三:冒泡排序——实现。

2302_78684687的博客 4万+

R语言安装包镜像报错?5分钟教你快速切换国内镜像源(含清华/阿里云配置)

本文详细介绍了R语言安装包镜像报错的解决方案,包括如何快速切换国内镜像源(如清华、阿里云等),解决'无法读写貯藏處索引'等常见问题。通过图形界面和命令行两种方式,帮助用户高效配置镜像源,提升R语言包安装速度与稳定性。

weixin_29053073的博客 418

pandas,构造MultiIndex的四种方法:from_tuples、from_arrays、from_product、from_frame

1、from_tuples:通过 “元组对” 构造MultiIndex """ 一对元组,为一个索引 """ tuples = [(1, 'red'), (1, 'blue'), (2, 'red'), (2, 'blue')] pd.MultiIndex.from_tuples(tuples, names=('number', 'color')) 2、from_arrays:通过 “列表元素的组合” 构造MultiIndex """ 列中表的元素,按位置 对应组合,形成索引 """ arrays

jieru_liu的博客 5387

数据结构之冒泡排序算法(图解+分析+代码调优)

1、冒泡排序的介绍 冒泡排序是一种比较简单的排序算法,其基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,可以形象的理解为像水底下的气泡一样逐渐向上冒。 2、图示冒泡排序 ...

IronmanJay 7056

冒泡排序图解

冒泡排序图解

zxs123csdn的博客 632

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

小学生图解排序算法:①冒泡排序

冒泡排序是一种计算机科学领域的较简单的排序算法。名字由来是因为越大的元素会经典交换慢慢“浮”到数列的顶端,故名。

纯文笔记 2037

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

图解冒泡排序法

冒泡排序 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序(即跟我们要的顺序相反)则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。 接下来我们通过一个实例讲解来学冒泡排序: 原始数组:3, 9, -1, 10, 20 下图是对冒泡排序过程的一个纤细描述: 从上图的过程中我们可以得到以下...

Gebo的博客 1395

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

图解Java实现冒泡排序(Bubble Sort)

1. **双重循环**:外层控制轮数,内层遍历比较。2. **相邻交换**:每次只交换相邻元素。3. **逐步沉底**:每轮确定一个最大值到末尾。4. **适用场景**:小规模数据或教学演示(实际开发中效率较低)。

zhangxueyi的专栏 802

冒泡排序——图解+java源码

冒泡排序——图解+java源码 冒泡排序 冒泡排序的算法 初始数组 将天平放在序列的右端,并比较天平左右数字 这种情况下,我们比较6和7 因为6小于7,所以左右的数字交换 比较完成后,逐一移动天平 重复同样的操作,直到天平移动的左端 直到天平到达左端 将天平返回右端 重复相同的操作,直到所有的数字都被排序。 参考代码: public class name { public static void main(String [] args){ //定义一个无序数组

qq_43673096的博客 257

冒泡排序——《图解算法》

冒泡排序分从大到小和从小到大两种排序方式。它们的唯一区别就是两个数交换的条件不同,从大到小排序是前面的数比后面的小的时候交换,而从小到大排序是前面的数比后面的数大的时候交换。我这里只说 从小到大的排序方式。 冒泡排序的原理:从第一个数开始,依次往后比较,如果前面的数比后面的数大就交换,否则不作处理。这就类似烧开水时,壶底的水泡往上冒的过程。 一、 图解分析 现以数组[8,7,6,4,5]为例,我...

爱雨轩 4万+

基础算法——图解冒泡排序

基础算法——冒泡排序 C语言实现 源码: #include<stdio.h> int main(void){ int a[10]; int x,y,t; printf("请输入10个整数:\n"); for(x=0;x<10;x++){ scanf("%d",&a[x]); } for (x=0;x<10;x++){ for (y=x+1;y<10;y++){ if (a[x]>a[y]){ t=a[x]; a[x]

Etui۹(・༥・´)و的博客 258

Java Bubble Sort 冒泡排序图解

本文介绍了 Java 中 Bubble Sort(冒泡排序图解)的相关内容。。。

Regino的博客 880

重温经典排序算法之冒泡排序——图解+C/C++实现

目录1.冒泡排序算法原理:2.算法性能分析:(1)时间复杂度(2)算法稳定性3.图解分析4.C/C++实现 1.冒泡排序算法原理: 【说明】这里实现的冒泡排序算法均为从小到大排序 1.比较相邻的元素,如果第一个比第二个大,就交换他们; 2.第一趟排序:第一个和第二个比较,若前者比后者大则交换;第二个和第三个比较满足前者较大则交换;随后依次进行相邻两个数的比较与交换,直到最后一对。第一趟排序结束后,...

SAMSARA的博客 6761

C语言——图解冒泡排序算法

冒泡排序(Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 冒泡排序图解 假设数组a刚开始的四个元素如下: ​ 每次比较两个元素 第1次冒泡排序,数组第0位开始,a[0] > a[1],交换a[0]和a[1]的值,交换之后,a[0] = 1,a[1] = 5

weixin_48231820的博客 1729
上一篇: 在AI“看起来已成大势”的情况下,传统Java后台开发,前景如何?
下一篇: 从今天起,码农翻身的号内搜索功能也可以使用了!
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值