重温算法之冒泡排序法

冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。

例如我们需要将12 35 99 18 76 这5 个数进行从大到小的排序。既然是从大到小排序,也就是说越小的越靠后。

首先比较第1 位和第2 位的大小,现在第1 位是12,第2 位是35。发现12 比35 要小,因为我们希望越小越靠后嘛,因此需要交换这两个数的位置。交换之后这5 个数的顺序是35 12 99 18 76。

按照刚才的方法,继续比较第2 位和第3 位的大小,第2 位是12,第3 位是99。12 比99 要小,因此需要交换这两个数的位置。交换之后这5 个数的顺序是35 99 12 18 76。

根据刚才的规则,继续比较第3 位和第4 位的大小,如果第3 位比第4 位小,则交换位置。交换之后这5 个数的顺序是35 99 18 12 76。

最后,比较第4 位和第5 位。4 次比较之后5 个数的顺序是35 99 18 76 12。经过4 次比较后我们发现最小的一个数已经就位(已经在最后一位,请注意12 这个数的移动过程),是不是很神奇。现在再来回忆一下刚才比较的过程。每次都是比较相邻的两个数,如果后面的数比前面的数大,则交换这两个数的位置。一直比较下去直到最后两个数比较完毕后,最小的数就在最后一个了。就如同是一个气泡,一步一步往后“翻滚”,直到最后一位。所以这个排序的方法有一个很好听的名字“冒泡排序”。

说到这里其实我们的排序只将5 个数中最小的一个归位了。每将一个数归位我们将其称为“一趟”。下面我们将继续重复刚才的过程,将剩下的4 个数一一归位。

好,现在开始“第二趟”,目标是将第2 小的数归位。首先还是先比较第1 位和第2 位,如果第1 位比第2 位小,则交换位置。交换之后这5 个数的顺序是99 35 18 76 12。接下来你应该都会了,依次比较第2 位和第3 位,第3 位和第4 位。注意此时已经不需要再比较第4位和第5 位。因为在第一趟结束后已经可以确定第5 位上放的是最小的了。第二趟结束之后这5 个数的顺序是99 35 76 18 12。

“第三趟”也是一样的。第三趟之后这5 个数的顺序是99 76 35 18 12。现在到了最后一趟“第四趟”。有的同学又要问了,这不是已经排好了吗?还要继续?当然,这里纯属巧合,你若用别的数试一试可能就不是了。你能找出这样的数据样例来吗?

请试一试。

“冒泡排序”的原理是:每一趟只能确定将一个数归位。即第一趟只能确定将末位上的数(即第5 位)归位,第二趟只能将倒数第2 位上的数(即第4 位)归位,第三趟只能将倒数第3 位上的数(即第3 位)归位,而现在前面还有两个位置上的数没有归位,因此我们仍然需要进行“第四趟”。“第四趟”只需要比较第1 位和第2 位的大小。因为后面三个位置上的数归位了,现在第1 位是99,第2 位是76,无需交换。这5 个数的顺序不变仍然是99 76 35 18 12。到此排 序完美结束了,5 个数已经有4 个数归位,那最后一个数也只能放在第1 位了。 最后我们总结一下:如果有n 个数进行排序,只需将n1 个数归位,也就是说要进行n-1 趟操作。而“每一趟”都需要从第1 位开始进行相邻两个数的比较,将较小的一个数放在后面,比较完毕后向后挪一位继续比较下面两个相邻数的大小,重复此步骤,直到最后一个尚未归位的数,已经归位的数则无需再进行比较(已经归位的数你还比较个啥,浪费表情)。这个算法是不是很强悍?记得我每次拍集体照的时候就总是被别人换来换去的,当时特别烦。不知道发明此算法的人当时的灵感是否来源于此。啰里吧嗦地说了这么多,下面是代码。建议先自己尝试去实现一下看看,再来看我是如何实现的。

```

public class BubbleSort{

public static void main(String[] args){

int score[] = {67, 69, 75, 87, 89, 90, 99, 100};

for (int i = 0; i < score.length -1; i++){    //最多做n-1趟排序

for(int j = 0 ;j < score.length - i - 1; j++){    //对当前无序区间score[0......length-i-1]进行排序(j的范围很关键,这个范围是在逐步缩小的)

if(score[j] < score[j + 1]){    //把小的值交换到后面

int temp = score[j];

score[j] = score[j + 1];

score[j + 1] = temp;

}

}

System.out.print("第" + (i + 1) + "次排序结果:");

for(int a = 0; a < score.length; a++){

System.out.print(score[a] + "\t");

}

System.out.println("");

}

System.out.print("最终排序结果:");

for(int a = 0; a < score.length; a++){

System.out.print(score[a] + "\t");

}

}

}

```

冒泡排序的核心部分是双重嵌套循环。不难看出冒泡排序的时间复杂度是O(N2)。这是一个非常高的时间复杂度。冒泡排序早在1956 年就有人开始研究,之后有很多人都尝试过对冒泡排序进行改进,但结果却令人失望。如Donald E. Knuth(中文名为高德纳,1974 年图灵奖获得者)所说:“冒泡排序除了它迷人的名字和导致了某些有趣的理论问题这一事实之外,似乎没有什么值得推荐的。”你可能要问:那还有没有更好的排序算法呢?不要走开,请看下节——快速排序。

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

推荐阅读更多精彩内容

  • 简化版的 桶排序 不仅仅有上一节所遗留的问题,更要命的是:它非常浪费空间!例如需要排序数的范围是 0~210000...
    青葱烈马阅读 326评论 0 0
  • 程序其实就是对数据的增删改查 以及对我们所得的数据进行排序。既然涉及到数据的处理就肯定会要牵扯到排序的算法选...
    小鸡在路上阅读 1,161评论 0 4
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,149评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,723评论 0 15
  • 排序的基本概念 在计算机程序开发过程中,经常需要一组数据元素(或记录)按某个关键字进行排序,排序完成的序列可用于快...
    Jack921阅读 1,404评论 1 4