Java排序算法——冒泡排序(Bubble Sort)

article/2025/10/24 15:58:09

冒泡排序是所有排序算法中最简单的一个排序,也是我个人学习的第一个排序方法,在这里重新进行一个总结。

冒泡排序(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图作者)

 

好,我说完了,看到这里你应该明白这个排序了,这确实是非常简单的排序,我会在之后有空写更多的算法。

有什么疑问或者疑似我说错的地方的在评论区告诉我吧,看到后我会回复你。


http://chatgpt.dhexx.cn/article/ZQe3vCOh.shtml

相关文章

Java排序算法——插入排序

Java排序算法——插入排序&#xff08;Insertion Sort&#xff09; 传送门 冒泡排序选择排序 简述 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前…

Java实现排序算法

一、常见排序算法&#xff1a; 1、插入类排序&#xff1a; (1)直接插入排序 (2)希尔排序 2、选择类排序 (1)简单选择排序 (2)堆排序 3、交换类排序 (1)冒泡排序 (2)快速排序 4、归并排序 5、基数排序 二、内部排序&#xff1a;只考虑数据量较小仅需要使用内存的排序算法 三、…

Java排序算法——选择排序

Java排序算法——选择排序&#xff08;Selection sort&#xff09; 传送门 冒泡排序插入排序 简述 选择排序&#xff08;Selection sort&#xff09;是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放…

JAVA排序:快速排序算法

Java实现快速排序算法 快速排序算法体现了—分治思想&#xff1a;将大问题划分为多个相同独立的小问题&#xff0c;每个小问题的解决合在一起解决了大问题 实现快速排序的思想&#xff1a; {2,4,1,0,3,5}是目标数组 {0,1,2,3,4,5}是结果数组 选取中心轴pivot(中心轴的值用于比较…

Java排序算法——选择排序(Selection Sort)

上次总结了一下冒泡排序&#xff0c;这次来看看同样非常简单的选择排序 上期冒泡排序传送门&#xff1a; Java排序算法——冒泡排序&#xff08;Bubble Sort&#xff09;https://blog.csdn.net/babbfqb93/article/details/123005968?spm1001.2014.3001.5501 选择排序&#…

选择排序——Java排序算法

选择排序 选择排序&#xff08;SelectSort&#xff09;选择排序是所有排序中最简单的排序算法之一&#xff0c;同时也是要求我们必须掌握的排序算法之一。 时间复杂度 选择排序的时间复杂度为(n2) 算法步骤 1.在未排序的序列中找到最小或者最大的元素&#xff0c;存放到排…

java 排序api_JAVA排序算法API

上一个类 下一个类 框架 无框架 摘要&#xff1a; 嵌套 | 字段 | 构造函数 | 方法 详细信息&#xff1a; 字段 | 构造函数 | 方法 org.luosijin.test 类 Sort java.lang.Object org.luosijin.test.Sort public class Sort extends java.lang.Object Java实现几种常见排序方…

Java排序算法

7.1 排序算法的介绍 排序也称排序算法(Sort Algorithm)&#xff0c;排序是将一组数据&#xff0c;依指定的顺序进行排列的过程。 7.2 排序的分类 内部排序: 指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。外部排序法&#xff1a; 数据量过大&#xff0c;无法全…

常见几种java排序算法

常见几种java排序算法 0. 总览时间复杂度和稳定性 1.插入排序2.分治排序法,快速排序法3.冒泡排序 low版4.冒泡排序 bigger版5.选择排序6. 归并排序8. 堆排序踩坑v1.0 巨慢不能用v2.0 太慢不能用v3.0 9. 其他排序7. 比较 0. 总览 时间复杂度和稳定性 平均最好最差稳定性冒泡n2…

Java常用实现八种排序算法与代码实现

一、交换排序 所谓交换&#xff0c;就是序列中任意两个元素进行比较&#xff0c;根据比较结果来交换各自在序列中的位置&#xff0c;以此达到排序的目的。 1. 冒泡排序 冒泡排序是一种简单的交换排序算法&#xff0c;以升序排序为例&#xff0c;其核心思想是&#xff1a; 从…

十大经典排序算法——java语言

文章目录 一、冒泡排序二、选择排序三、插入排序四、希尔排序五、归并排序六、快速排序七、堆排序八、计数排序九、桶排序十、基数排序 一、冒泡排序 概述&#xff1a; 冒泡排序是一种简单直观的排序算法。它重复的走访要排序的数列&#xff0c;一次比较两个元素&#xff0c;按…

Java常见排序算法

目录 1、归并排序 2、堆排序 3、基数排序 4、冒泡排序 5、希尔排序 6、快速排序 7、插入排序 8、选择排序 1、归并排序 1、基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治&#xff08;divide-a…

java实现七种经典排序算法

简单算法&#xff1a;冒泡&#xff0c;简单选择&#xff0c;直接插入 改进算法&#xff1a;希尔&#xff0c;堆&#xff0c;归并&#xff0c;快速 直接插入排序&#xff1a;将一个记录插入到已经拍好的有序列表中&#xff0c;从而得到一个新的、记录数增加1的有序表。 冒泡排…

java实现10种排序算法

1.冒泡排序(Bubble Sort) import java.util.Arrays; //冒泡排序 public class BubbleSort_01 {public static void main(String[] args) {int a[]{3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};//记录比较次数int count0;//i0,第一轮比较for (int i 0; i < a.length-1; i) {…

SQL sever数据库触发器设计

SQL sever数据库触发器设计 一、目的: 能够理解触发器调用的机制。能够使用SQL命令创建DML触发器。能够完成触发器的修改、删除等管理任务。 二、触发器: 定义&#xff1a;触发器&#xff08; T rigger &#xff09;是 SQL server 提供给程序员和数据分析员来保证数据完整性…

MySQL——超详细数据库触发器教程

目录 一、触发器的概念 二、创建触发器 三、查看触发器 四、删除触发器 总结 一、触发器的概念 在实际开发中往往会碰到这样的情况&#xff1a; 当我们对一个表进行数据操作时&#xff0c;需要同步对其它的表执行相应的操作&#xff0c;正常情况下&#xff0c;如果我们使用…

关于数据库触发器(trigger)的简单使用操作

最近在做一些东西&#xff0c;用到关于数据库触发器的简单使用。比如当我们在做用户模块的表设计的时候&#xff0c;我们建了联用户信息表&#xff08;t_user&#xff09;和账号表&#xff08;t_account&#xff09;&#xff0c;账号表&#xff08;t_account&#xff09;用来进…

MySQL数据库触发器

MySQL 数据库中触发器是一个特殊的存储过程&#xff0c;不同的是执行存储过程要使用 CALL 语句来调用&#xff0c;而触发器的 执行不需要使用 CALL 语句来调用&#xff0c;也不需要手工启动&#xff0c;只要一个预定义的事件发生就会被 MySQL自动调用 引发触发器执行的事件一般…

mysql数据库触发器失效,mysql 的数据库触发器解决方法

mysql 的数据库触发器 我要做一个数据库触发器&#xff0c;当删除数据库中的某一张表的时候触发这个一个事件&#xff0c;删除其他表中的某一些数据。 大家给个例子 ------解决方案-------------------- MYSQL官方免费手册中已经有现成的例子了。 CREATE TABLE test1(a1 INT); …

什么是数据库触发器?

目录 什么是数据库触发器&#xff1f; 事件 AFTER触发器 INSTEAD OF触发器 特殊数据库对象 定义 用于触发器 复杂的审计 执行业务规则 派生列值 触发器很棘手&#xff01; 什么是数据库触发器&#xff1f; 数据库触发器是在数据库中发生特定操作时运行的特殊存储过…