冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。

算法步骤

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

动图演示

算法实现

首先定义数组:

int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};

因为冒泡排序是将最大的数放到最后面,先不管其他的,先进行第一轮排序,由此可以得到代码:

    public void bubble(int[] arr) {// 定义临时交换的变量,稍后用int temp;for (int j = 0; j < arr.length - 1; j++) {/*因为索引是从0开始,所以首先arr[0]和arr[1]做比较,而arr[1],可以是 j + 1由此可以得出,第一轮排序的时候 j 要小于 len - 1,避免数组越界异常*/if (arr[j] > arr[j + 1]) {// 如果该条件成立的话,则进行两数交换操作,使用临时变量完成交换temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}

此时执行代码可以发现,最大的数已经被放到了末尾

现在进行第二轮操作:

public void bubble(int[] arr) {int temp;for (int j = 0; j < arr.length - 1; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}/*重复上面操作,这次 j 要小于 len - 1 - 1,第一个 1 防止数组越界异常,第二个 1 因为最后面的数字已经是最大的了,所以没有必要进行比较,*/for (int j = 0; j < arr.length - 1 - 1; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}

此时运行代码,可以发现第二大的数字被放在了倒数第二的位置:

因为每一轮操作后,都会把最大的数放到对应的位置,所以第三轮for循环的判断条件应该是 j < arr.length - 1 - 2;,第四轮应该是 j < arr.length - 1 - 3;

由此规律,可以再写出一个循环,将上面写好的循环嵌入其中,这样每一轮冒泡的时候,可以是 j < arr.length - 1 - i;,i 是这个循环的循环变量,因为第一轮冒泡不用减,所以这个循环的循环变量 i 从0开始。

那什么时候结束呢?i 的值代表着第几轮冒泡,实际的冒泡轮数应该是数组的长度减1,因为到最后两个数字比较过后,最后一个数字是没有必要比较的,经上述分析,可以得出代码:

    public void bubble(int[] arr) {// 定义临时交换的变量,不用在循环中频繁定义int temp;// 该外循环是冒泡的轮数for (int i = 0; i < arr.length - 1; i++) {// 该内循环是将相对最大的数字放到最后for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}

执行代码可以发现冒泡排序已经搞定:

【排序算法】冒泡排序(动图演示) - 保姆级详解相关推荐

  1. 十大经典排序算法(动图演示)(转)

    十大经典排序算法(动图演示) 本文转自https://www.cnblogs.com/onepixel/articles/7674659.html 0.算法概述 0.1 算法分类 十种常见排序算法可以 ...

  2. c 语言从大到小排序算法,10 大经典排序算法(动图演示+ C 语言代码)

    原标题:10 大经典排序算法(动图演示+ C 语言代码) 来源:C语言与CPP编程 以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. ...

  3. 十大经典排序算法(动图演示,收藏好文)

     0.算法概述  0.1 算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线 ...

  4. 数据结构与算法--经典10大排序算法(动图演示)【建议收藏】

    十大经典排序算法总结(动图演示) 算法分类 十大常见排序算法可分为两大类: 比较排序算法:通过比较来决定元素的位置,由于时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序 非比较类型排 ...

  5. 【C#】十大排序算法(动图演示+代码实现)

    文章目录 1.冒泡排序 2.插入排序 3.选择排序 4.快速排序 5.希尔排序 6.堆排序 7.归并排序 8.计数排序 9.桶排序 10.基数排序 参考 1.冒泡排序 口诀: 外层循环 n-1;内层循 ...

  6. 【算法基础】十大经典排序算法(动图)

    算法分类 冒泡排序(重点) 选择排序 插入排序 归并排序(重点) 快速排序(重点) 堆排序(重点) 计数排序 基数排序 本文的重点排序方法在:冒泡排序,归并排序,快速排序,桶排序. 文末有学习资料免费 ...

  7. 十大经典排序算法的动图

    十大经典排序算法的动图 动图的百度网盘 2020-08-28更新:找到了希尔排序的一个好例子,比希尔排序的动图讲得更清楚.添加进zip包,文件名为:4_ShellSort_希尔排序举例.docx 链接 ...

  8. 万字手撕七大排序(代码+动图演示)

    万字拿捏七大排序 1.排序的概念及其运用 1.1排序的概念 1.2 排序的运用 1.3 常见的排序算法 2. 常见排序算法的实现 2.1 插入排序 2.1.1 基本思想 2.1.2直接插入排序 2.1 ...

  9. 【Python黑科技】几行代码绘制gif动图(保姆级图文+实现代码)

    目录 实现效果 实现思路 实现代码 总结 欢迎关注 『Python黑科技』 系列,持续更新中 欢迎关注 『Python黑科技』 系列,持续更新中 实现效果 实际效果不美观--因为我找的图片不太行··· ...

最新文章

  1. 一次DPM备份Exchange DAG的故障处理过程
  2. 过滤器java面试_过滤器监听器面试题都在这里
  3. 【计算机组成原理】补码的加减运算方法
  4. 大数据之-Hadoop伪分布式_Log日志查看和NN格式化前强调---大数据之hadoop工作笔记0024
  5. pythoncharm如何安装opencv_Pycharm Opencv环境配置
  6. 从辉煌到困局,奥康还能不能绝地反击?
  7. 投票系统C语言程序,C语言课程投票程序系统.doc
  8. Smith预估控制实验 simulink模型
  9. ESP32开发学习 LVGL Littlevgl 使用文件系统
  10. springboot集成阿里云短信
  11. 别再自己抠图了,Python教你一招弄完
  12. 阿里云账号注册实名认证详细教程(支付宝实名认证)
  13. 解决eclipse neno在线下载安装缓慢及失败的问题
  14. 计算机无法读取配置文件,由于权限不足,无法读取配置文件
  15. HashMap的最大容量为什么是1左移30(2的30次方)
  16. 应用程序无法正常启动0xc000007b请点击确定关闭应用程序
  17. LeetCode:292. Nim Game Nim 游戏(C语言)
  18. 为什么计算机编程全用英语,为什么所有编程都是英文的?为什么不能中文程序?...
  19. 硬盘插在苹果电脑上显示不出来怎么办? 苹果电脑怎么扩容硬盘?
  20. tp管理界面找不到服务器,TP-LINK路由器无法登陆管理界面的解决办法

热门文章

  1. V4L2驱动开发详解
  2. java详解动态代理中的代理对象
  3. 3秒解决微信后台上传图片模糊的痛,秒变高清
  4. 机器学习需要的最小数据量是多少?
  5. nginx前言 - 负载均衡
  6. Ubuntu添加或删除MySQL用户与权限、远程访问
  7. 计算机键盘上除在哪里,计算机键盘上的主页按钮在哪里?主页按钮的功能
  8. Java发邮件使用模板实践——替换配置文件中的参数
  9. 提升记忆力的几大要素及方法
  10. 史上最全的常用开发工具类收集Android