写给媳妇儿的算法(四)——冒泡排序

【引言】我们都经历过新生开学,一个班里几十个同学,军训的时候我们需要按照身高站成一队,个子高的站在后面,个子矮的站在前面。如果你是班主任的话,你会怎么让同学调整他们之间的位置,最终让所有的人都按照身高大小站好呢?

冒泡排序是一种通过两两对比的方式,依次找出最值的排序方式。

算法过程

使用冒泡排序来进行班级里面队伍的排列,就像是鱼在水里吐泡泡一样(应该会吐吧tx)。由于压强跟水深有关,所以泡泡从水底升到水面的过程中会逐渐的变大,最终变到最大升出水面。排列队伍也是一样,最高的那个人会在从前到后的两两对比中,最终站到队伍的最后面。

泡泡升出水面.png

班主任在排队的时候可以这么做(假设有 5 个同学):
1、让全班同学 不分大小 站成一列,身高分别为(队伍从前到后):150 165 160 173 155。
2、从前向后两两比较,首先比较1、2同学:150 165 160 173 155。
3、150 同学比 165 同学要矮,队伍保持不动,转而比较2、3同学:150 165 160 173 155。
4、165 同学比 160 同学要高,这样,两位同学 互换位置,以保证后面的要比前面的高:150 160 165 173 155。
5、继续比较3、4同学:150 160 165 173 155。
6、3 同学比 4 同学矮,所以队伍不进行变化:150 160 165 173 155。
7、继续比较4、5同学:150 160 165 173 155
8、前面的 4 同学比后面的 5 同学高,所以交换位置:150 160 165 155 173

这样就完成了第一次的队伍规整,我们可以看到,进行了第一次所有人的从前往后的两两对比,现在整只队伍最高的那个人已经站到了队尾,就像鱼吐泡泡一样,最大的泡泡已经浮出了水面。

继续从头到尾重复上面的过程,直到所有的人从前往后站队成从小到大。总体的过程就像是(队伍从下往上,过程从前往后):
第一次整理:
155 155 155 155 155 173
173 173 173 173 173 155
160 160 165 165 160 160
165 165 160 160 165 165
150 150 150 150 150 150
第二次整理:
173 173 173 173 173 173
155 155 155 155 165 165
160 160 165 165 155 155
165 165 160 160 160 160
150 150 150 150 150 150
第三次整理:
173 173 173 173 173
165 165 165 165 165
155 155 160 160 160
160 160 155 155 155
150 150 150 150 150

就像这样,像鱼吐泡泡一样,逐渐的整个队伍就站成了从前往后,从大到到小的顺序。站队的过程,就是前面的同学和后面的同学比较,互换位置的过程。班主任就会很省事……

时间复杂度

当然,冒泡排序可以进行改进,增加一个标志位,如果一次遍历中没有发生值的交换,就证明整个数列都是有序的,这样,最好的情况下就是一开始整个序列就是有序的,所以,最好的情况下,时间复杂度是O(n)。

最坏的情况下,需要反复遍历所有的元素,这样,时间复杂度就会变成O(n^2)。

所以平均时间复杂度为O(n^2)。

算法实现

#coding:utf-8
import numpy as np

def bubble_sort(data):
    data_length = len(data)
    for i in range(data_length, 0, -1):
        for j in range(1, i, 1):
            if  data[j] < data[j-1]:
                data[j], data[j-1] = data[j-1], data[j]

array = np.arange(20)
np.random.shuffle(array)
array = list(array)
print('输入的数据: {}'.format(array))
bubble_sort(array)
print('排序之后的数据:{}'.format(array))

结果是:

冒泡排序的结果.png



上一篇:写给媳妇儿的算法(三)——选择排序
上一篇:写给媳妇儿的算法(五)——插入排序

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