面试官: 写一个冒泡排序吧

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

一、冒泡思想

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

有一天,克带着得意弟子谦子去溪边游玩,看到许多大大小小的石头在溪边,克拿起了四个大小不同的石子,摆成一行,如下:

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

“先找出最大的放在右边,然后再找出次大的,放在最大的左边,按照这个规律就可以依次排好了”,谦子回答道

“那你如何找到最大的呢?”,克问道

“用肉眼看”,谦子弱弱的说了一句

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

“那该如何找最大的呢?”,谦子问道

“你看那水中的鱼,他们时不时地吐出泡泡,那泡泡越往上走就会越大

我们可以借鉴这种思路

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

克看谦子不明白,于是说:“起始时,左下标指向第一个石子,右下标指向第二个石子,然后比较”,说着说着画了一个图

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

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

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

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

克脸上露出满意的笑容

然后克问,如果有 N 个石子,称从左到右找最大为一趟,那么要排好序需要多少趟?

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

二、冒泡代码

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

“这个。。。”,谦子挠了挠头,傻傻地笑了一下,克看了谦子一眼,转而在地下飞速地写了短短的几行代码

谦子心中暗暗惊叹老师的功力

“这个第一层循环是控制趟数,第二行能具体讲讲吗?”,谦子笑了笑问道

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

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

谦子点了点头

三、时间复杂度

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

谦子心里想到:

既然排序完需要3趟,第一趟需要比较3次,第二趟需要比较2次,第三趟需要比较1次,那一共比较了 3 + 2 + 1 次

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

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

“O(n^2)”,谦子想了一会说道

“恩恩,不错”,克说道

四、稳定性

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

“哦,什么是稳定性?”,谦子问道

“哦,这个还没有给他讲”,克忽然想起来

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

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

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

“恩恩,对的”,克说道

天色渐晚,克和弟子走在了回去的路上,回去的路上克告诉谦子今天的排序算法叫冒泡排序

五、优化一下冒泡排序的算法

假如从开始的第一对到结尾的最后一对,相邻的元素之间都没有发生交换的操作,这意味着右边的元素总是大于等于左边的元素,此时的数组已经是有序的了,我们无需再对剩余的元素重复比较下去了。

代码如下:

public static int[] bubbleSort(int[] arr) {if (arr == null || arr.length < 2) {return arr;}int n = arr.length;for (int i = 0; i < n; i++) {boolean flag = true;for (int j = 0; j < n -i - 1; j++) {if (arr[j + 1] < arr[j]) {flag = false;int t = arr[j];arr[j] = arr[j+1];arr[j+1] = t;}}//一趟下来是否发生位置交换if(false)break;}return arr;
}

另外,算法的学习也是必经之路,这里给大家推荐一个大佬的刷题笔记

下载链接:BAT大佬的刷题笔记太经典

把这份笔记突击学习一下,很多算法考察,基本都稳了

另外,再给大家推荐一份某大佬的 leetcode 刷题笔记,汇聚了上千道 leetcode 题解,并且代码都是 beat 100%:

下载链接:leetcode 分类题解(最优解)

就算你现在不学算法,那么这份笔记也值得你收藏,万一有人问你 Leetcode 某道题解,或者有大神在讨论题解,咱打开这份笔记,不管三七二十一,直接把最优解扔给他,然后退出群聊

作者简洁

作者:大家好,我是帅地,从大学、自学一路走来,深知算法计算机基础知识的重要性,公众号「帅地玩编程」10万粉丝作者,专业于写这些底层知识,提升我们的内功,帅地期待你的关注,和我一起学习,点击了解我四年大学学 习之路 转载说明:未获得授权,禁止转载

要是你还看不懂这篇冒泡排序,麻烦找我要红包相关推荐

  1. 身为程序员还看不懂UML类图? 一文带你零基础学会看UML类图!

    身为程序员还看不懂UML类图? 一文带你零基础学会看UML类图! 一,UML类图示例图 二,UML类图图例 三,分步解析说明 3.1 类图: 3.2 接口: 3.3 实现继承 3.4 实现接口: 3. ...

  2. 还看不懂同事的代码?Lambda 表达式、函数接口了解一下

    本文经授权转载自微信公众号:未读代码 Java 8 早已经在2014 年 3月 18日发布,毫无疑问 Java 8 对 Java 来说绝对算得上是一次重大版本更新,它包含了十多项语言.库.工具.JVM ...

  3. 机器学习作业之波士顿房价(boston)数据分析与绘图(注释我都写了这么多,我不信你还看不懂?)

    目录 一.前言 二.简单介绍头文件 1.sklearn头文件 意外 2.其他头文件 三.题目理解 1.题目的简单介绍 2.属性标签 3.降维比喻 四.代码 1.代码及注释 2.代码缺点 五.运行结果 ...

  4. 老罗的《Android系统源代码情景分析》翻了10遍还看不懂?因为你用错了

    最近老朽又把罗升阳老师的<Android系统源代码情景分析>拿出来啃了一番. 为什么要加个"又"呢?因为从老罗的第一版开始到迄今为止尚未更新的第三版为止,每年有学习冲动 ...

  5. 熬夜整理Java面试笔试题,你还看不懂吗?

    前言 说真的,在 Java 使用最多的集合类中,List 绝对占有一席之地的,它和 Map 一样适用于很多场景,非常方便我们的日常开发,毕竟存储一个列表的需求随处可见.尽管如此,还是有很多同学没有弄明 ...

  6. 老师讲的真棒!Java高级程序员面试集合,你还看不懂吗?

    前言: 首先介绍一下我的同学,专科毕业应用电子技术专业,已经毕业快两年了.因为专业的原因工作一年觉得没什么发展前途就想转行,身为他的"好基友",他觉得我这个工作挺好的,就咨询了我一 ...

  7. 征服Java面试官!为什么数据库会丢失数据?你还看不懂吗?

    前言 提到IT人员,人们的第一印象就是高薪资,包括转行来学Java的人绝大多数都是冲着高薪以及就业广泛来的. 前段时间跟同学聊天,她说她老公在一家互联网公司做Java后台开发,年薪四十万,最近在准备复 ...

  8. Nginx面试!java语言程序设计第四版,你还看不懂吗?

    第5章 持久化 持久化,Redis的持久化功能有效避免因进程退出造成的数据丢失问题,本章首先介绍RDB和AOF两种持久化配置和运行流程,其次对常见的持久化问题进行定位和优化,最后结合Redis常见的单 ...

  9. Zookeeper选主过程,理论和源码结合,还看不懂给你发红包

    文章目录 前言 1.节点角色 2.选举过程 2.1 胜出的条件 2.2 比较的规则 3.代码逻辑综述 4.源码分析 结语 前言 Zookeeper作为Dubbo生态的默认注册中心,得到了非常的普遍的应 ...

  10. 蒙德里安森林算法_双鱼座艺术家大啊啊科普,这回你还看不懂蒙德里安算我输...

    转眼到了双鱼座宝宝们的生日月 - 三月.一提到双鱼座,你能想到什么呢?浪漫,多情,爱幻想?如果你以为双鱼座只是这么简单,那你就错了.比如咱们今天要介绍的荷兰艺术家皮特·蒙德里安,对,就是那个靠在画布上 ...

最新文章

  1. 把python语言翻译出来_Python语言实现翻译小工具(Python打包成exe文件)
  2. R语言均匀分布函数uniform Distribution(dunif, punif, qunif runif)实战
  3. Linux下将文件打包、压缩并分割成指定大小
  4. HTML的五种经典布局方式(二)
  5. python继承实现原理封装property
  6. 《大数据分析原理与实践》一一第3章 关联分析模型
  7. android微信调试网页,Mac OS X EI Capitan 下调试 Android 微信内嵌网页
  8. ArcGIS中文注记图层发布服务后变乱码(方框乱码)/如何有效修改注记要素类文字样式
  9. 砍掉中国90%的科研人员,对科技发展的影响微乎其微,某教授酒后真言!
  10. 大数据python之简单的网络爬虫代码实现(单一与循环代码进行网络爬虫)
  11. Android LitePal使用总结
  12. macOS Monterey 12.4 (21F79) 虚拟机 ISO 镜像
  13. 基于pytorch的GAN网络搭建
  14. 打包Hololens2 VS error MSB3774: 找不到 SDK“WindowsMobile, Version=10.0.19041.0”解决办法
  15. 201671030118 词频统计软件项目报告
  16. 检查给定串是否存在于由区间及点集的结合内
  17. 项目设计-基于SpringBoot和Vue开发的宿舍管理系统
  18. 利用NI模拟量输出板卡LabVIEW输出正弦波形的方法
  19. AM335x SPL(一)
  20. 正版推荐 -Macs Fan Control 控制苹果电脑上风扇工具软件

热门文章

  1. 齐齐哈尔大学考研计算机专业,齐齐哈尔大学(专业学位)计算机技术研究生考试科目和考研参考书目...
  2. 简单个人静态HTML网页设计作品——广西北海家乡旅游景点 10页 DIV布局个人介绍网页模板代码 DW个人网站制作成品 web网页制作与实现
  3. 教妹学Java(十七):do-while 循环
  4. 一次用Python制作电影字幕的尝试
  5. 计算机高级培训教师感言,教师信息技术培训感言信息技术培训心得多篇.docx
  6. 该文件没有与之关联的程序来执行操作。解决方案
  7. CNN(卷积神经网络)的深度
  8. stm32F407中arr与psc以及pwm之间的关系
  9. shader编程-三维场景下SDF建模,对模型进行扭曲、弯曲、裁剪、掏空操作(WebGL-Shader开发基础12)
  10. 这张图可以帮助解释为什么欧洲有些国家欢迎难民,有些国家拒绝难民【The Washington Post】