敲重点图解冒泡排序

Posted 卓象程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了敲重点图解冒泡排序相关的知识,希望对你有一定的参考价值。

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

(划重点,认真听呦!本文篇幅很长,但是用简单的故事带你了解冒泡排序,便于理解!)

【敲重点】图解冒泡排序


冒泡思想

在算法过年,相传有一位算法大师,他不喜欢做官,一心只在民间传道受业,弟子三千,人称“江湖巍哥”。

有一天,江湖巍哥带着新收的弟子张大胖去溪边游玩,看到许多大大小小的石头在溪边,他灵机一动,就拿起了四个大小不同的石子,摆成一行:【敲重点】图解冒泡排序

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


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


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


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


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


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


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

【敲重点】图解冒泡排序


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


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


【敲重点】图解冒泡排序


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

【敲重点】图解冒泡排序


“这样一来,每次比较完,右下标指向的石头就是已经比较过的元素中的最大元素”,巍哥微微笑了一下,然后又画了一个图:【敲重点】图解冒泡排序


“按照这个做法,这一趟下来所有石子中最大的就跑到最右边了”,大胖悟出了其中的真谛,接着老师的话说了一句,自己在地上也画了一个图:【敲重点】图解冒泡排序


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

【敲重点】图解冒泡排序


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


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

【敲重点】图解冒泡排序


冒泡代码

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


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


【敲重点】图解冒泡排序



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


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


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



【敲重点】图解冒泡排序
【敲重点】图解冒泡排序

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


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



时间复杂度

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


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


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


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

【敲重点】图解冒泡排序

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


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


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


稳定性

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


“哦? 什么是稳定性?”


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


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

【敲重点】图解冒泡排序


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


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


“恩,对的”,


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


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


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

(完)

# 特别介绍 #

卓象程序员,是龙江地区为数不多的专业php专业教学团队,我们针对0基础想学习的同学开设为期两周免费的体验课。

让大家先简单的了解认识PHP这门计算机语言,其次要给自己一个清晰的定位,如学历、基本素质、兴趣爱好和将来自己想要从事的工作等,按上述分类,在作出选择。


一个积极上进的圈子

      
        
        
      

学IT 找teacher岩

入行领路人

▲长按二维码“识别”关注



以上是关于敲重点图解冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

图解C语言冒泡排序算法,含代码分析

八大排序算法C语言过程图解+代码实现(插入,希尔,选择,堆排,冒泡,快排,归并,计数)

图解算法系列之冒泡排序(优化版)

排序算法之冒泡选择插入排序(Java)

排序算法之冒泡选择插入排序(Java)

图解算法系列之冒泡排序(Low版)