轻松读懂数据结构系列:早操排队图解冒泡排序

一、说在前面

一直想写一些简单易懂的文章,因为平时看的很多的书籍或者文章都是看着很难受的感觉,当然,这并不是说书籍写的不好,只是说对于一些没有太多基础或者基础不是很好的来说,相对来说还是比较难以理解的。

这个系列主要是写一些简单易懂的数据结构与算法的文章,同时也是帮助自己再理解理解这方面的知识。

作为数据结构与算法的开篇,还是以排序算法作为第一部分的内容,需要注意的是,这一系列的文章并不是涉及到很多理论性质的知识,因为前面说了,主要还是希望文章是简单易懂的,希望能达到读故事的感觉。如果需要去学习理论性质的知识,可以去查看相关的数据结构与算法的书籍。

二、冒泡排序算法

作为这一系列的第一部分,主要讲解排序算法。从小到大,我们至少前20年的时间都是在学校度过了,校园生活在我看来是十分的美好的,以至于现在我都还在校园里面生活。在我们读书的阶段,是不是经常会碰到排队的时候,因为大家都熟悉这一场景,所以,我们就一排队来讲解排序算法

冒泡算法应该是我们最熟悉不过的算法了,也是我们最熟悉不过的排队了,既然熟悉不过,那么我们今天就来排个冒泡排序的队列吧。

今天早上,老师叫我们去操场上做早操,做早操之前呢,需要排队,排队都有一个排法,不是吗?那么,老师今天就要求我们按照身高由低到高依次排好

于是,我们早上很快就一起到了操场上,总共有5个人到了操场,刚刚去的时候,队列肯定是散的对吧,这时候的队列是下面这样子的:第0个位置站的小明,第1个位置站的小海,第2个位置站的小刘,第3个位置站的小李,第5个位置站的小爱。

图片.png

于是老师(假设老师是一个程序员哈,皮一下)要求我们按照冒泡排序的方法排好队:挨个的比较身高,如果比下一个位置上的同学高,就换一下位置

好了,同学们听到老师的指示之后呢,同学们就开始动身了。

第0个位置上的小明同学和第1个位置上的小海同学相互比了一下身高,发现第1个位置上的小海同学(1.80m)比第0个位置上的小海同学(1.60m)高,于是就保持不动,所以第一次排队后,队列还是保持不变的。

接下来,第1个位置上的小海同学还想和第2个位置上的小刘同学比一下身高,发现第1个位置上的小海同学比第2个位置上的小刘同学高,所以,他们互换一下位置。

互换位置

于是,队列成了下面的样子,小海和小刘换了一下位置

小海和小刘交换后

之后,第2个位置上的小海同学,又和第3个位置上的小李同学比了一下身高,发现,第2个位置上的小海同学还是比第3个位置上的小李同学高,所以他们还是需要交换一下位置的。

小海和小李互换

这时候,队列变成了下面的样子,小海和小李互换

小海和小李互换

接下来第3个位置上的小海同学和第4个位置上的小爱同学进行了身高的比较,发现第3个位置上的小海同学还是比第4个位置上的小爱同学高,所以又需要换一下。

图片.png

交换后,变成了这样子:

图片.png

结果我们发现,通过这种排序方法,最高的小海从第2个位置上跑到了最后一个位置

好了,现在最高的小海的位置已经确定了,我们就不管他了,我们又从第0个位置上的同学开始,第0个位置的小明同学和第1个位置的小刘同学比较身高,发现小明的身高比小刘的矮,所以队列维持不变。

接下来,第1个位置上的小刘和第2个位置上的小李比较,发现,小刘比小李高,所以需要交换位置

交换后,变成了下面的队列

然后,第2个位置上的小刘和相邻的第3个位置上的小爱比较身高,发现小爱比小刘高,所以不交换位置

最后一个位置的小海因为第一轮已经知道他最高了,所以不与他比较了,因此,这轮排完之后,我们发现,整个序列已经是有序的了,我们看一下队列的变化。

图片.png
图片.png

从这排队的过程中,我们是不是发现了冒泡排序的思想

第一遍,第一个位置上的同学开始,挨个的比较身高,如果第0个位置的同学比第1个位置的同学高,就交换位置,否则,不换位置,然后,第1个位置与第2个位置的同学比一下身高,如果第1个位置的同学高比第2个位置的同学高,交换位置,否则不换,以此类推,最高的同学将会到最后一个位置上。

第二遍,还是从第一个位置上的同学开始,第1个同学和第2个同学比较,如果第一个同学比第二个同学高,交换位置,否则不变,然后,第2个位置上的同学和第3个位置的同学比较,如果第2个位置的同学高,则交换位置,否则不换。这一遍,因为第一遍已经找出来最高的同学在最后一个位置,所以最后一个位置不用比较了。

直到队列全部排好为止。

到这里,我想你应该明白了冒泡排序的思想了。

接下来,我们看一下代码的实现(这里我们使用Java代码实现)。

public static void bubbleSort(int[] arr) {
        //如果数组为空,或者元素为1,直接返回。
        if (arr == null || arr.length < 2) {
            return;
        }

        for (int e = 0; e < arr.length - 1; e++) {//每次最大元素就像气泡一样"浮"到数组的最后
            for (int i = 0; i < n-1-e; i++) {//n-1-e:-1是因为元素从0下表开始,-e是因为可以减去已排到最后的几个元素,可以减少比较次数。
                if (arr[i] > arr[i + 1]) {//如果大于下一个位置
                    swap(arr, i, i + 1);//交换位置
                }
            }
        }
    }

    /**
     * 交换元素位置
     * @param arr
     * @param i
     * @param j
     */
    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
性能分析

最差时间复杂度:O(n^2)
最优时间复杂度:如果已经是有序的,可以把最优时间复杂度降低到O(n)
平均时间复杂度:O(n^2)
所需辅助空间:O(1)
稳定性:稳定
稳定性说明:排序稳定不稳定,就是看每次排序的过程中,是否会改变整个序列的位置。

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号好好学java,获取优质学习资源。

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

推荐阅读更多精彩内容