Java排序算法——冒泡排序(Bubble Sort)
冒泡排序是所有排序算法中最简单的一个排序,也是我个人学习的第一个排序方法,在这里重新进行一个总结。
冒泡排序(Bubble Sort)就如同其名称一样,水中的气泡由于压强的原因所以从下到上其大小也是从小到大,如下图:
整个排序过程分为一个大循环和大循环中的很多小循环进行,我们先来讲其中的小循环他做的事情:
每次小循环其实做的事情都很简单,就是单纯的循环所有数据找到其中最大值,将最大值放到当前比较数据的最后一个位置。下面给大家举个例子:
第一步,我们需要一个随机生成的数组,如下图:
代码部分:
public static void main(String args[]){Random r = new Random();//申明并实例化一个Random对象int[] iArray = new int[7];//申明并实例化一个int数组用于测试排序for (int i = 0; i < iArray.length; i++) {//通过Random随机生成一个0(含)到50(不含)的数并插入对应位置iArray[i] = r.nextInt(50);}System.out.println(Arrays.toString(iArray));//通过方法输出数组结果//如果你不理解Arrays.toString(int[] a) 那就用下面这个循环 他们是一回事System.out.print("[");for (int i=0;i<iArray.length;i++) {System.out.print(iArray[i]);if(i==iArray.length-1){System.out.println("]");}else{System.out.print(", ");}}
}
小循环做的事情其实就是循环比较,第一步:将第[0]位和第[1]位数字进行比较若后面位置的数字比前面位置数字小,则交换两者位置,如下图:
由于"20“比”40“小,所以将数字进行交换,变成”20“在第[0]位,"40"在第[1]位,接下来就是需要比较的是第[1]位的"40"和第[2]位的"18",由于"18"比"40"小,所以交换两者的位置:
依此类推比较直到最后最后一位数字为止,如下图:
可以看到,40在每一次比较之后都向后移了一位,从而从第一的位置到了最后,这样,我们就确定了整个数组中最大的数字。
第一轮的小循环比较就完全结束了,最终生成的结果为:
那么我们将上面的逻辑翻译成代码:
public static void main(String[] args) {//...以上为数据生成代码int temp;//临时存储用于交换数字用//内层小循环//由于逻辑中涉及iArray[i + 1]如果循环条件不-1,会多一次比较,并且会抛数组下表越界异常for(int i = 0;i<iArray.length-1;i++){//比较两个数据大小,如果前面的大则交换if(iArray[i]>iArray[i+1]){//交换逻辑 starttemp = iArray[i];iArray[i] = iArray[i+1];iArray[i+1] = temp;//交换逻辑 end}}System.out.println(Arrays.toString(iArray));
}
用上面的逻辑跑出来可以看到执行的结果已经将随机生成的数组中最大的那个数字移动到了最后一个位置。
接下来就要进行第二轮的比较了,第二的比较依旧是将第[0]位和第[1]位数字进行比较,不过有一点不一样的事情是之前是比较到整个数组的最后一个数字,而这次只需要比较到整个数组的倒数第二位数字(因为第一轮的小循环已经将最大的值放到了最后,无需比较最后一位数的大小,他肯定是最大的)。
第二轮的比较为:
接下来就是第三轮...
依次类推,每次比较的终点位置都是数组长度减去已经执行的次数:
整体的执行效果如下图:
让我们把逻辑翻译成代码:
public static void main(String[] args) {//...以上为数据生成代码int temp;//临时存储用于交换数字用//外层循环,我们需要循环的总次数是总长度-1for(int j = 0;j<iArray.length-1;j++) {//内层小循环//逻辑中涉及iArray[i + 1]如果循环条件不-1,会多一次比较,并且会抛数组下表越界异常for (int i = 0; i < iArray.length - 1 -j; i++) {//比较两个数据大小,如果前面的大则交换if (iArray[i] > iArray[i + 1]) {//交换逻辑 starttemp = iArray[i];iArray[i] = iArray[i + 1];iArray[i + 1] = temp;//交换逻辑 end}}}System.out.println(Arrays.toString(iArray));
}
这里看到第二次循环条件中多了-1和-j,-1是因为5个数字我们只需要比较4次,-j的原因是每次比较的终点位置都是数组长度减去已经执行的次数。
以上就是常规的冒泡排序了,非常简单,我们可以稍微优化一下,比如假如一个数组在第一次循环就完成了,比如生成的数组是
[100, 1, 2, 3, 4]
这种情况只需要第一次循环就完成了排序,不需要第二次以及以后的循环。
所以我们可以在最开始新增一个标志位,如果没有进入过大小判断,那么我们直接所有跳出循环。
代码如下:
public static void main(String[] args) {//...以上为数据生成代码int temp;//临时存储用于交换数字用boolean flag;//新增一个旗帜用于判断是否循环已经完成//外层循环,我们需要循环的总次数是总长度-1for(int j = 0;j<iArray.length-1;j++) {//重置旗帜flag = true;//内层小循环//逻辑中涉及iArray[i + 1]如果循环条件不-1,会多一次比较,并且会抛数组下表越界异常for (int i = 0; i < iArray.length - 1 -j; i++) {//比较两个数据大小,如果前面的大则交换if (iArray[i] > iArray[i + 1]) {//交换逻辑 starttemp = iArray[i];iArray[i] = iArray[i + 1];iArray[i + 1] = temp;//交换逻辑 end//发生过交换需要说明数组没完成排序flag = false;}//如果旗帜没有修改过,则可以直接跳出循环,节约时间if(flag){break;} }}System.out.println(Arrays.toString(iArray));
}
引用一下个人查询到的相关gif,帮助大家总结一下(我实在找不到gif的作者,这个图用于学习真的很棒!感谢gif图作者)
好,我说完了,看到这里你应该明白这个排序了,这确实是非常简单的排序,我会在之后有空写更多的算法。
有什么疑问或者疑似我说错的地方的在评论区告诉我吧,看到后我会回复你。
Java排序算法——冒泡排序(Bubble Sort)相关推荐
- 排序算法——冒泡排序(Bubble Sort)
排序算法--冒泡排序(Bubble Sort) 算法简介(Introduction) Bubble sort is to compare adjacent elements of the list a ...
- 经典排序算法 - 冒泡排序Bubble sort
经典排序算法 - 冒泡排序Bubble sort 其原理是比较接近的数字22,按照从小到交换大或降序排列, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头開始进行两两比較交换,直到倒 ...
- 基础排序算法 – 冒泡排序Bubble sort
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束. 从小到大排序: 原 ...
- Java排序算法——冒泡排序 及其稳定性和时间复杂度
冒泡排序(Bubble Sort) 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成 ...
- Java排序算法——插入排序(Insertion Sort)
之前总结了交换排序的冒泡排序与选择排序的简单选择排序,这次我们来看看插入排序的简单插入排序~ 往期传送门: 冒泡排序: Java排序算法--冒泡排序(Bubble Sort)https://blog. ...
- java排序链表冒泡排序_Java中的冒泡排序
java排序链表冒泡排序 Java Sorting is one of the many aspects of java interview questions. In this post, we w ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2 ...
- 排序 时间倒序_经典排序算法之冒泡排序(Bubble Sort)
冒泡排序 ( Bubble Sort ) 冒泡排序,正如它的名字一样,未排序数组中的最大(小)值会依次往上浮.冒泡排序主要有两个基本步骤:相邻元素之间的比较 和 交换位置. 步骤分析: 令待排序序列为 ...
- 【算法】Bubble Sort(泡式排序)的编程实现思路及其复杂度分析==>冒泡排序
冒泡排序 Bubble Sort的复杂度分析 什么是复杂度? 简单的来说当我们需要衡量算法的优异程度的时候就需要用到它... 对一个算法来说,我们一般用时间和空间这两个维度来衡量它.也就是算法的执行时 ...
- php编写冒泡排序算法_PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
本文实例讲述了PHP排序算法之冒泡排序(Bubble Sort)实现方法.分享给大家供大家参考,具体如下: 基本思想: 冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换 ...
最新文章
- Linux QtCreator 设置mingw编译器生成windows程序
- 程承熊LEE微购店的买家秀
- 小小知识点(十五)——origin pro 2018 安装和消除demo字样
- java中数组的返回值是什么类型_Java数组也是一种数据类型
- 轻量级 HTTP(s) 代理 TinyProxy
- lua 函数回调技巧
- 2022“点点点”测试员如何上岸测试开发岗?附完整学习路线!
- 32蜂鸣器天空之城代码_stm32版蜂鸣器播放爱若琉璃
- apache 禁用rc4_如何在Apache中禁用过时的TLS和SSL版本
- 【区块链开发入门】(二) 以太坊的编程接口
- MATLAB 爬取配色css数据及渐变图
- 上传文件nginx限制大小解决
- eq, neq.gt,ge,lte,lt,not,mod的含义
- 数据预处理-Excel 两列合并为一列中间加空格
- 攻防世界高手进阶区——dice_game
- 鸿蒙系统充电动画,荣耀智慧屏首发抢先体验:电视只是小功能,鸿蒙系统才是真亮点...
- 访客模式 无痕模式 区别_旧访客设计模式的新生活
- 如何通俗的理解beam search?
- 梯度下降—Python实现
- 同济大学计算机学院杨志强,大学计算机课程论坛-同济大学计算机基础教研室.PDF...
热门文章
- 2022-2028全球食品和饮料行业热转印设备行业调研及趋势分析报告
- proteus元件图片_最完整的Proteus元件库元件名称及中英对照表下载
- Chrome的油猴Tampermonkey下载安装,以及搜索安装脚本
- 137_原始套接字_发送UDP数据,模仿他人飞秋给另一个飞秋客户端发送信息
- (戴尔灵越7572)笔记本外扩显示器以后,笔记本没有声音了的解决办法
- 当软件定义汽车成为趋势,未来汽车是否可以理解为四个轮子上的超级计算机?
- java项目汇率管理模板_项目管理文件夹模板
- MLP算法,也叫前馈神经网络或多层感知器
- iOS开发常见的宏定义(实用)
- 邮政储蓄计算机笔试题,邮储总行计算机类笔试题