搞定冒泡排序

排序是校招(或初级社招)最常见的考点之一,普通IT公司主要考察简单排序,经常让你手写一个排序算法。既能考察代码实现水平,又能看看思维方式,对面试官来说,实在是高效面试、回去加班之必备考题!

大部分同学会说,那我就写一个冒泡排序吧,因为冒泡的思路最好理解。

当然,能正常写出来的也就20%左右,主要是两层循环的指针起始数字不准确;还有要命的,说是写冒泡,但是代码却是插入排序;最NB的是代码写对了,但是让讲讲思路,一问三不知,靠背代码过面试还是有难度的。

今天我们就讲一下冒泡排序,讲完之后,大家如果不能在理解的情况下闭着眼写出代码来,请在评论区留言。

1、简单排序

首先理解下简单排序,随意给出一给乱序的数给a[],比如 15,9,7,-1,6,3,正常情况下,从头到尾只走一遍是不能排序完成的,只能保证把一个数放到属于它的那个萝卜坑里。

也就是说一个循环搞不定,那就加一个循环呗。外循环控制循环轮数,内循环一轮排好一个数。而且对外循环来说,n个数已经排好了n-1个,那最后一个自然就不用排了,所以只用走n-1轮

代码实现如下:


内循环按各自排序的思路实现,不管是冒泡排序、直接插入排序还是简单选择排序,都是类似的两个循环样式,平均时间复杂度都是O(n^2),所以都称之为简单排序。

2. 冒泡排序思想

冒泡排序的思想是,每轮内循环相邻的两个进行比较,如果前面的数比后面的在,就交换位置,直到最后的排序位置上。

先给大家看个图,绿色的就是内循环相邻的两个数不断后移比较,橙色的是本轮走完,已经排序好的数。


因为是交换,所以内层代码是


3. 处理内循环的起始值


可以看出内循环每轮都是从第一个数开始比较的,所以j的起始值为0。稍微麻烦点的是结束值,首先要理解的是相邻两个数进行比较,而且内部实现里也用了j+1。所以第一轮时j最多到n-1。后面的第一轮结束点都提前结束一个值,因为前面一轮已经排序好的数一定比本轮的数大,就不用再比较和交换了。其实就是减去轮数,也就是 n-i-1,

到此,冒泡排序就完成了



4. 还有个尾巴

冒泡排序其实还可以简单优化一下的。如果在某一轮排序中,一次交换也没发生。也就是说对于任意相邻的两个数,后面的数都比前面的数大,意味着什么呢?对,就是已经完成排序了。后面就不需要一轮一轮的继续比较下去了。

我们来调整下代码。一次交换也没有,也就是是否发生交换,一看到”是否“,而且最终是没有交换就结束,那定义一个bool类型的变量

boolean isChanged =false;

因为比较交换在内循环,而且每轮中一出现交换就要改变值为true,一直到本轮结束,所以这句话只能放在外循环内,内循环外。

最终的比较语句是

if(!isChange) {//没有交换

       break;

}

也只能放在外循环内,内循环外。

最终优化版的代码如下

public int[] bubbleSort(int a[]) {

int len = a.length;


     for(int i=0 ; i < len -1; i++ ) {

           boolean isChanged = false;//标记是否发生变化

           for(int j = 0 ; j < len - i - 1; j++) {

                 if(a[j] > a[j+1]) {

                       int temp = a[j+1];

                       a[j+1] = a[j];

                        a[j] = temp;

                         isChanged = true;//发生交换

                  }

           }

            if(!isChanged) {//本轮没有发生交换就退出

                break;

             }

     }

      return a;

}

本文为【拿OFFER】原创,转载请标明出处。

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

推荐阅读更多精彩内容

  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,323评论 0 1
  • 自从晓清从远在南面的湛江回来,生活就特别不顺遂!原本她是个开朗的心大的女孩,什么事都不放在心上!可是她却受不了...
    毛豆豆666阅读 182评论 0 0
  • 前些天无聊时看到一个小的益智题,这个题目我刚看到的时候觉得还有点意思,立马拿起笔就开始算,各种倍数啊,个位数应该是...
    0156770c53ab阅读 240评论 0 0
  • 🦁️本以为小狮子们在精灵超市只会买自己喜欢的物品,结果每次回来都会给老师们带礼物,还给爸爸妈妈也买了礼物! 🦁️本...
    虹影老师阅读 717评论 0 0