【排序算法】冒泡排序(动图演示) - 保姆级详解
冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
算法步骤
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
动图演示
算法实现
首先定义数组:
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;}}}}
执行代码可以发现冒泡排序已经搞定:
【排序算法】冒泡排序(动图演示) - 保姆级详解相关推荐
- 十大经典排序算法(动图演示)(转)
十大经典排序算法(动图演示) 本文转自https://www.cnblogs.com/onepixel/articles/7674659.html 0.算法概述 0.1 算法分类 十种常见排序算法可以 ...
- c 语言从大到小排序算法,10 大经典排序算法(动图演示+ C 语言代码)
原标题:10 大经典排序算法(动图演示+ C 语言代码) 来源:C语言与CPP编程 以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. ...
- 十大经典排序算法(动图演示,收藏好文)
0.算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线 ...
- 数据结构与算法--经典10大排序算法(动图演示)【建议收藏】
十大经典排序算法总结(动图演示) 算法分类 十大常见排序算法可分为两大类: 比较排序算法:通过比较来决定元素的位置,由于时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序 非比较类型排 ...
- 【C#】十大排序算法(动图演示+代码实现)
文章目录 1.冒泡排序 2.插入排序 3.选择排序 4.快速排序 5.希尔排序 6.堆排序 7.归并排序 8.计数排序 9.桶排序 10.基数排序 参考 1.冒泡排序 口诀: 外层循环 n-1;内层循 ...
- 【算法基础】十大经典排序算法(动图)
算法分类 冒泡排序(重点) 选择排序 插入排序 归并排序(重点) 快速排序(重点) 堆排序(重点) 计数排序 基数排序 本文的重点排序方法在:冒泡排序,归并排序,快速排序,桶排序. 文末有学习资料免费 ...
- 十大经典排序算法的动图
十大经典排序算法的动图 动图的百度网盘 2020-08-28更新:找到了希尔排序的一个好例子,比希尔排序的动图讲得更清楚.添加进zip包,文件名为:4_ShellSort_希尔排序举例.docx 链接 ...
- 万字手撕七大排序(代码+动图演示)
万字拿捏七大排序 1.排序的概念及其运用 1.1排序的概念 1.2 排序的运用 1.3 常见的排序算法 2. 常见排序算法的实现 2.1 插入排序 2.1.1 基本思想 2.1.2直接插入排序 2.1 ...
- 【Python黑科技】几行代码绘制gif动图(保姆级图文+实现代码)
目录 实现效果 实现思路 实现代码 总结 欢迎关注 『Python黑科技』 系列,持续更新中 欢迎关注 『Python黑科技』 系列,持续更新中 实现效果 实际效果不美观--因为我找的图片不太行··· ...
最新文章
- 一次DPM备份Exchange DAG的故障处理过程
- 过滤器java面试_过滤器监听器面试题都在这里
- 【计算机组成原理】补码的加减运算方法
- 大数据之-Hadoop伪分布式_Log日志查看和NN格式化前强调---大数据之hadoop工作笔记0024
- pythoncharm如何安装opencv_Pycharm Opencv环境配置
- 从辉煌到困局,奥康还能不能绝地反击?
- 投票系统C语言程序,C语言课程投票程序系统.doc
- Smith预估控制实验 simulink模型
- ESP32开发学习 LVGL Littlevgl 使用文件系统
- springboot集成阿里云短信
- 别再自己抠图了,Python教你一招弄完
- 阿里云账号注册实名认证详细教程(支付宝实名认证)
- 解决eclipse neno在线下载安装缓慢及失败的问题
- 计算机无法读取配置文件,由于权限不足,无法读取配置文件
- HashMap的最大容量为什么是1左移30(2的30次方)
- 应用程序无法正常启动0xc000007b请点击确定关闭应用程序
- LeetCode:292. Nim Game Nim 游戏(C语言)
- 为什么计算机编程全用英语,为什么所有编程都是英文的?为什么不能中文程序?...
- 硬盘插在苹果电脑上显示不出来怎么办? 苹果电脑怎么扩容硬盘?
- tp管理界面找不到服务器,TP-LINK路由器无法登陆管理界面的解决办法