图解冒泡排序

原作者:涛声依旧,微信公众号“趣味编程”
原博客链接:图解冒泡排序

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

冒泡思想

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

冒泡代码

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

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

public static void BubbleSort(int[] arr){
    int temp = 0;
    for(int i = 0;i< arr.length-1;i++){ // 一共 n-1 趟
        for(int j = 0;j < arr.length-1-i; j++){ // 第 i+1 趟时,一共需要比较多少次
            if(arr[j]>arr[j+1]){ 
                temp = arr[j]; //交换 arr[j]与 arr[j+1]两个元素
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }       
        }
    }
}

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

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

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

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

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

时间复杂度

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

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

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

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

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

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

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

稳定性

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

“哦? 什么是稳定性?”

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

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

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

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

“恩,对的”,Bill说道。

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 阅读原文 冒泡排序是一个比较经典和简单的排序算法,今天我们从从算法本身,时间复杂度以及稳定性方面来看看冒泡排序,这...
    gyl_coder阅读 387评论 0 2
  • 一、 单项选择题(共71题) 对n个元素的序列进行冒泡排序时,最少的比较次数是( )。A. n ...
    貝影阅读 8,977评论 0 10
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,164评论 0 52
  • 排序的基本概念 在计算机程序开发过程中,经常需要一组数据元素(或记录)按某个关键字进行排序,排序完成的序列可用于快...
    Jack921阅读 1,416评论 1 4
  • 各位亲爱我朋友大家晚上好 欢迎大家来到这91期的周二电波,今天晚上的讲座由林乐义 老师给大家讲《人脉资源管理》,据...
    叶粟阅读 322评论 1 3