【数据结构与算法】十大经典排序算法-冒泡排序

🌟个人博客:www.hellocode.top
🏰Java知识导航:Java-Navigate
🔥CSDN:HelloCode.
🌴掘金:HelloCode
🌞知乎:HelloCode
⚡如有问题,欢迎指正,一起学习~~


冒泡排序(Bubble Sort)是一种简单的排序算法,它通过重复地交换相邻元素的位置来将最大(或最小)的元素逐步“冒泡”到正确的位置。它是一种稳定的排序算法,意味着具有相等键值的元素在排序后的序列中相对位置不会发生改变。

基本思想

在这里插入图片描述

  1. 从序列的第一个元素开始,比较相邻的两个元素大小,如果它们的顺序不正确,则交换它们的位置。
  2. 继续向后遍历序列,对每一对相邻元素执行步骤1,直到序列的末尾。
  3. 重复上述过程,但是每次比较的元素个数减一,因为每次遍历都会将最大(或最小)的元素“冒泡”到正确的位置。
  4. 重复执行以上步骤,直到整个序列排序完成。

如上图所示,传统的冒泡排序就是通过对数组内的元素,从前往后,两两进行比较,每一轮都会确定出一个最大值,放在合适的位置。

代码实现

对应在代码层面,就是两轮for循环来进行遍历,这种思想还是比较简单且容易理解的(简单粗暴)

/*** @author HelloCode* @blog https://www.hellocode.top* @date 2023年08月07日 20:43*/
public static void bubbleSort(int[] arr){for(int i = 0; i < arr.length; i++){for (int j = 0; j < arr.length - i - 1; j++){if(arr[j] > arr[j + 1]){// 需要交换int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}

测试:

/*** @author HelloCode* @blog https://www.hellocode.top* @date 2023年08月07日 20:43*/
public class Test {public static void main(String[] args) {int[] arr = {21, 13, 4, 10, 7, 65, 32, 15, 32, 19};System.out.println("排序前:" + Arrays.toString(arr));BubbleSort.bubbleSort(arr);System.out.println("排序后:" + Arrays.toString(arr));}
}

在这里插入图片描述

优化

优化法一

在每一轮循环之前,设置一个标志位来标记本轮循环是否进行了元素交换。如果在一轮循环中没有发生任何交换操作,说明整个数组已经有序,就无需继续进行后续的比较,直接退出循环。这个优化可以提前结束排序过程,减少了不必要的比较操作,从而提高算法的效率。然而,当数组内的元素乱序程度较高时,这种优化的效果可能并不明显。具体代码如下:

/*** @author HelloCode* @blog https://www.hellocode.top* @date 2023年08月07日 21:00*/
public static void bubbleSortOptimized1(int[] arr) {for (int i = 0; i < arr.length; i++) {boolean isSwap = false;for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 需要交换,设置标记位为trueint temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;isSwap = true;}}if (!isSwap) {// 如果一轮循环结束未发生一次交换,则说明已经有序,提前结束循环break;}}
}

测试:

/*** @author HelloCode* @blog https://www.hellocode.top* @date 2023年08月07日 21:02*/
public class Test {public static void main(String[] args) {int[] arr = {21, 13, 4, 10, 7, 65, 32, 15, 32, 19};System.out.println("排序前:" + Arrays.toString(arr));BubbleSort.bubbleSortOptimized1(arr);System.out.println("排序后:" + Arrays.toString(arr));}
}

在这里插入图片描述

优化法二

在外层和内层两个循环中,内层循环进行两次遍历:一次从头到尾,找出本轮循环中最大的元素;另一次从尾到头,找出本轮循环中最小的元素。结合优化法一使用标志位提前退出循环的方式,可以进一步减少每轮循环中的比较次数,从而提高冒泡排序的性能。具体代码如下:

/*** @author HelloCode* @blog https://www.hellocode.top* @date 2023年08月07日 21:10*/public static void bubbleSortOptimized2(int[] arr) {for (int i = 0; i < arr.length; i++) {boolean isSwap = false;// 从头到尾找出最大元素并将其冒泡到正确位置for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 需要交换,设置标记位为trueint temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;isSwap = true;}}if (!isSwap) {// 如果一轮循环结束未发生一次交换,则说明已经有序,提前结束循环break;}isSwap = false;// 从尾到头找出最小元素并将其冒泡到正确位置for (int j = arr.length - i - 2; j >= i + 1; j--) {if (arr[j] < arr[j - 1]) {// 需要交换,设置标记位为trueint temp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = temp;isSwap = true;}}if (!isSwap) {// 如果一轮循环结束未发生一次交换,则说明已经有序,提前结束循环break;}}
}

测试:

/*** @author HelloCode* @blog https://www.hellocode.top* @date 2023年08月07日 21:18*/
public class Test {public static void main(String[] args) {int[] arr = {21, 13, 4, 10, 7, 65, 32, 15, 32, 19};System.out.println("排序前:" + Arrays.toString(arr));BubbleSort.bubbleSortOptimized2(arr);System.out.println("排序后:" + Arrays.toString(arr));}
}

在这里插入图片描述

总结

优点

  1. 冒泡排序算法实现简单,易于理解和实现。
  2. 对于小规模的数据集,冒泡排序可能比其他排序算法性能稍微好一些。
  3. 由于每次只交换相邻元素,冒泡排序可以实现原地排序,不需要额外的内存空间。

缺点

  1. 冒泡排序的时间复杂度较高,特别是对于大规模数据集。它需要进行多次遍历和交换操作,导致性能较差。
  2. 不管数据集是否已经有序,冒泡排序都要执行完所有的遍历和比较操作。

复杂度

  • 时间复杂度:冒泡排序的最坏时间复杂度为O(n2),平均时间复杂度也为O(n2),其中n为待排序序列的长度。在最好情况下(待排序序列已经有序),冒泡排序的时间复杂度为O(n)。
  • 空间复杂度:冒泡排序是一种原地排序算法,不需要额外的内存空间,因此空间复杂度为O(1)。

虽然冒泡排序在实际应用中并不常用,但理解它可以帮助我们理解其他更复杂的排序算法,并且在某些特定场景下,它也可能是一种合理的选择。然而,对于大规模数据的排序,更高效的排序算法(如快速排序、归并排序等)通常会更为适用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/34370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

form 表单恢复初始数据

form 表单恢复初始数据 在现代的 Web 开发中&#xff0c;表单是不可或缺的组件之一。用户可以通过表单输入和提交数据&#xff0c;而开发者则需要对这些数据进行处理和存储。然而&#xff0c;在某些情况下&#xff0c;我们可能需要重置表单并恢复到最初的状态。 本文介绍了如…

MATLAB计算连续月份的不同栅格数据间的相关系数(输出为tif影像)

%先导入投影信息&#xff0c;某个影像的路径就行&#xff08;最好是你分析的数据中的一个&#xff09; [a,R]readgeoraster(G:\SIF\Global-AI_monthly_v3\bi\199001.tif); infogeotiffinfo(G:\SIF\Global-AI_monthly_v3\bi\199001.tif); [m,n]size(a); i1;gwzeros(m*n,24); %此…

锐捷设备密码管理、密码恢复、恢复出厂设置

目录 配置登录用户名密码以及Enable密码 只需要密码登录 需要用户名和密码登录&#xff08;无AAA&#xff09; 需要用户名和密码登录&#xff08;有AAA&#xff09; 密码恢复 Web密码忘记 Telnet/SSH密码忘记 Console密码忘记 所有密码都忘记&#xff0c;通过Console进…

服务器数据恢复-RAID5上层Hyper-V虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 一台Windows Server服务器&#xff0c;部署Hyper-V虚拟化环境&#xff0c;虚拟机的硬盘文件和配置文件存放在一台DELL存储中。该存储中有一组由4块硬盘组建的RAID5阵列&#xff0c;用来存放虚拟机的数据文件&#xff0c;另外还有一块大容量硬盘…

nvm的使用

nvm (Node Version Manager) 是管理Node.js版本的一个工具,主要的使用方法如下: 安装nvm: https://github.com/coreybutler/nvm-windows/releases或者通过wget、git等下载安装脚本,然后运行安装。 验证安装: command -v nvm列出可安装的版本: nvm ls-remote安装指定版本: …

【TypeScript】进阶之路语法细节,类型和函数

进阶之路 类型别名(type)的使用接口(interface)的声明的使用二者区别&#xff1a; 联合类型和交叉类型联合类型交叉类型 类型断言获取DOM元素 非空类型断言字面量类型的使用类型缩小&#xff08;类型收窄&#xff09;TypeScript 函数类型函数类型表达式内部规则检测函数的调用签…

keil下载程序具体过程:概述

一、前言 keil下载程序具体过程将由一系列的博客组成&#xff0c;将深入探讨keil这种IDE下载镜像文件时具体做了哪些事情。我们平常下载镜像的时候&#xff0c;只是点击了一下Download按钮&#xff0c;剩下的都由keil替代我们完成了。本系列博客将揭示这一过程&#xff0c;keil…

【云原生】kubernetes控制器deployment的使用

目录 ​编辑 1 Controller 控制器 1.1 什么是 Controller 1.2 常见的 Controller 控制器 1.3 Controller 如何管理 Pod 2 Deployment 2.1 创建 deployment 2.2 查看 deployment 2.3 扩缩 deployment 2.4 回滚 deployment 2.5 删除 deployment 1 Controller 控制器 …

markdown命令模板

markdown快速入门(typora) 1、代码块 //代码块语 public static void main(String[] args){}//linux下spring项目的启动命令 # java -jar blog start ## 2、标题&#xff1a;java # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题3、字体 …

Webpack 的 sass-loader 在生产模式下最小化 CSS 问题

学习webpack时候我发现一个问题&#xff1a; 将mode 改为production模式后&#xff0c;生成的css会被压缩了&#xff0c;但是我并没有引入CssMinimizerPlugin插件&#xff0c;然后我试着将optimization.minimize 设置为false&#xff0c;测试是否为webpack自带的压缩&#xff0…

RWEQ风蚀方程模型与ArcGIS数据处理Python代码库添加结合理论研究和科研实践

RWEQ模型是应用比较普遍的能适应大区域定量估算风蚀量的模型。该模型是基于大量野外实验的一种经验模型&#xff0c;在实际测定风力导致的土壤侵蚀量以及当地的气象、地表植被、土壤湿度、地表的结皮和地表的可蚀性等因子的基础上得出的一个经验方程。 1、掌握土壤风蚀模型的原…

【计算机网络】——数据链路层

二、组帧 1、字符计数法 帧头部使用一个字符来表示帧的大小(包括第一个计数字符) &#xff08;此处一字符一个字节&#xff09; 2、字符填充收尾定界法 特定字符来定界帧的首和尾。若帧中数据段出现等同于特定字符的字符内容&#xff0c;前置一个转义字符。(类似于正则表达…

PowerShell 获取某目录下所有的文件、文件夹,同时对获取到的文件路径字符串进行替换处理

PowerShell 获取某目录下所有的文件、文件夹&#xff0c;同时对获取到的文件路径字符串进行替换处理 前言&#xff1a; 为了将Windows系统下的Java编译文件与linux服务器上的文件进行比较&#xff0c;故进行此文件路径的获取及路径处理。 在只有文件路径 而没有实际文件的情况下…

Postman 的简单使用

什么是Postman 在程序开发中用于调试网络程序或者跟踪网页请求。可以对网页进行简单的基本信息调试。Postman最早是作用chrome浏览器插件存在的&#xff0c;但是2018年初Chrome停止对Chrome应用程序的支持。所以现在Postman提供了独立的安装包&#xff0c;不再依赖于Chrome浏览…

flutter 初识(开发体验,优缺点)

前言 最近有个跨平台桌面应用的需求&#xff0c;需要支持 windows/linux/mac 系统&#xff0c;要做个更新应用的小界面&#xff0c;主要功能就是下载更新文件并在本地进行替换&#xff0c;很简单的小功能。 花了几分钟构建没做 UI 优化的示例界面&#xff1a; 由于我们的客…

WuThreat身份安全云-TVD每日漏洞情报-2023-08-09

漏洞名称:致远OA文件上传漏洞 漏洞级别:高危 漏洞编号:NULL 相关涉及:1. A6、A8、A8N的V8.0SP2、V8.1、V8.1SP1 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-19494 漏洞名称:Microsoft Exchange Server 欺骗漏洞 漏洞级别:高危 漏洞编号:CV…

代码随想录训练营day18 二叉树

106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 //左根右 左右根/* 第一步&#xff1a;如果数组大小为零的…

Redis—缓存

目录标题 缓存雪崩发生场景解决方案针对Redis宕机的缓存雪崩解决方案 缓存击穿发生场景解决方案 缓存穿透发生场景解决方案布隆过滤器 数据库和缓存数据一致性 缓存雪崩 大量缓存数据在同一时间过期&#xff08;失效&#xff09;或者 Redis 故障宕机时&#xff0c;如果此时有大…

腾讯云香港服务器租用_2核2G20M_2核4G30M

腾讯云香港服务器租用费用表&#xff0c;目前中国香港地域轻量应用服务器可选配置2核2G20M、2核2G30M、2核4G30M&#xff0c;操作系统可选Windows和Linux&#xff0c;不只是香港云服务器&#xff0c;新加坡、硅谷、法兰克福和东京服务器均有活动&#xff0c;腾讯云服务器网分享…

项目一:基于stm32的阿里云智慧消防监控系统

若该文为原创文章&#xff0c;转载请注明原文出处。 Hi&#xff0c;大家好&#xff0c;我是忆枫&#xff0c;今天向大家介绍一个单片机项目。 一、简介 智慧消防监控系统&#xff0c;是用于检测火灾&#xff0c;温度&#xff0c;烟雾的监控系统。以 stm32单片机为核心外加 MQ…