数据结构与算法-冒泡排序

引言

        在数据结构与算法的世界里,冒泡排序作为基础排序算法之一,以其直观易懂的原理和实现方式,为理解更复杂的数据处理逻辑提供了坚实的入门阶梯。尽管在实际应用中由于其效率问题不常被用于大规模数据的排序任务,但它对于每一位初学者构建扎实的算法思维框架至关重要。

一、冒泡排序的理论解析

        冒泡排序的基本思想是通过不断地遍历待排序序列,并逐对比较相邻元素,若前一个元素大于后一个元素(以升序为例),则交换它们的位置,就像气泡在水中逐渐上浮至水面一样,数组中的最大(或最小)元素经过一轮遍历就会“浮”到正确位置。

冒泡排序的具体步骤如下:

  1. 从数组的第一个元素开始,对每一对相邻元素进行比较。
  2. 如果当前元素比下一个元素大,则交换这两个元素的位置。
  3. 对数组的所有元素执行以上操作,直到数组末尾。这样第一轮结束时,最大的元素将被放置在数组的最后。
  4. 重复上述过程,但每次遍历时无需考虑已经排好序的部分,即每次只需针对剩余未排序部分执行冒泡操作,直至整个数组完全有序。

二、冒泡排序的时间复杂度与优化策略

        原始冒泡排序在最坏情况下的时间复杂度为O(n^2),在最好情况下(已排序数组)的时间复杂度为O(n)。为了提高效率,我们可以引入一种优化策略——设置一个标志位,记录每轮循环是否发生过交换。如果某轮没有发生任何交换,则说明数组已经完全有序,可以直接结束排序。

三、冒泡排序的过程图解

图解小结:

1.一共进行,数组的大小-1次大的循环

2.每一趟排序的次数在逐渐减少 

3.如果我们发现在某趟排序中,没有发生一次交换,可以提前结束冒泡循环,这就是优化

四、冒泡排序的代码实践 

1.展示每一次冒泡排序过程

System.out.println("第一趟排序的效果");
//        验证冒泡排序流程for (int i = 0; i < arr.length - 1; i++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.println(Arrays.toString(arr));System.out.println("第二趟排序的效果");
//        验证冒泡排序流程for (int i = 0; i < arr.length - 1 - 1; i++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.println(Arrays.toString(arr));System.out.println("第三趟排序的效果");
//        验证冒泡排序流程for (int i = 0; i < arr.length - 1 - 2; i++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.println(Arrays.toString(arr));System.out.println("第四趟排序的效果");
//        验证冒泡排序流程for (int i = 0; i < arr.length - 1 - 3; i++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.println(Arrays.toString(arr));

2.总结规律得到过程 

//    由以上代码分析可得,一个for循环的条件就相当于 arr.length - 1 - ifor (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;}}}System.out.println(Arrays.toString(arr));

3.进行优化 

        //    代码进行优化
//    目标:解决在一趟排序中,一次交换都没有发生过,浪费开销boolean flag = false;     //表示变量,表示是否进行交换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]) {flag = true;temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.printf("第%d趟排序后的数组为", i + 1);System.out.println(Arrays.toString(arr));if (!flag) {   //没有交换过的情况直接结束本次循环break;} else {flag = false;   //重置flag,进行下次判断}}

五、深入理解冒泡排序的价值

        虽然在实际生产环境中,我们可能更多地会选择如快速排序、归并排序等高效算法,但冒泡排序的简单性和直观性使其成为教学和学习的理想选择。它帮助我们掌握基本的排序概念,理解算法背后的设计思路,并启示我们在面对性能瓶颈时寻求优化策略的重要性。同时,通过对冒泡排序的剖析,我们也能更深入地认识到数据结构与算法设计的核心原则:如何用简洁而有效的逻辑来解决复杂的问题。

六、总结

        冒泡排序虽然在性能上并非最优解,但它的简单明了使得它成为数据结构与算法入门教学的理想工具。通过对冒泡排序的学习,我们能够深刻理解排序算法的核心理念,即通过不断的比较和交换,达到数据有序的目标。此外,冒泡排序的优化过程也启示我们在设计和实现算法时,应注重分析问题本质,积极寻求效率提升的可能性。因此,无论是在理论学习还是实践运用中,冒泡排序都发挥着承前启后的重要作用,为深入探索更高级的排序算法奠定了坚实的基础。

 

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

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

相关文章

【C++】set、multiset与map、multimap的使用

目录 一、关联式容器二、键值对三、树形结构的关联式容器3.1 set3.1.1 模板参数列表3.1.2 构造3.1.3 迭代器3.1.4 容量3.1.5 修改操作 3.2 multiset3.3 map3.3.1 模板参数列表3.3.2 构造3.3.3 迭代器3.3.4 容量3.3.5 修改操作3.3.6 operator[] 3.4 multimap 一、关联式容器 谈…

Hololens 2应用开发系列(1)——使用MRTK在Unity中设置混合现实场景并进行程序模拟

Hololens 2应用开发系列&#xff08;1&#xff09;——使用MRTK在Unity中进行程序模拟 一、前言二、创建和设置MR场景三、MRTK输入模拟的开启 一、前言 在前面的文章中&#xff0c;我介绍了Hololens 2开发环境搭建和项目生成部署等相关内容&#xff0c;使我们能生成一个简单Ho…

Redis 之九:Spring Data Redis -- Redis Template 用法

SpringData Redis Spring Data Redis 是 Spring Data 项目的一部分&#xff0c;它为 Java 应用程序提供了一种便捷的方式来与 Redis 数据库进行交互。 Spring Data Redis 提供了对 Redis 的抽象封装&#xff0c;使得开发者能够以面向对象的方式操作 Redis&#xff0c;并简化了 …

matlab 写入格式化文本文件

目录 一、save函数 二、fprintf函数 matlab 写入文本文件可以使用save和fprintf函数 save输出结果: fprintf输出结果: 1.23, 2.34, 3.45 4.56, 5.67, 6.78 7.89, 8.90, 9.01 可以看出fprintf输出结果更加人性化,符合要求,下面分别介绍。 一、save函数 …

linux系统Jenkins工具介绍

Jenkins概念介绍 Jenkins概念Jenkins目的特性产品发布流程 Jenkins概念 Jenkins是一个功能强大的应用程序&#xff0c;允许持续集成和持续交付项目&#xff0c;无论用的是什么平台。这是一个免费的源代码&#xff0c;可以处理任何类型的构建或持续集成。集成Jenkins可以用于一些…

MQL5-MT5连接上国内期货

主要原因是昨天在学习MACD时发现给的基础代码感觉不对&#xff0c;但无法证明&#xff0c;因为MT5接的都是外汇交易&#xff0c;数据和国内的文华啥的全对不上&#xff0c;便找了一些国内接CTP的&#xff0c;直接写代码有点麻烦&#xff0c;虽然之前对接过国内CTP的东西&#x…

AI入门笔记(三)

神经网络是如何工作的 神经网络又是如何工作的呢&#xff1f;我们用一个例子来解释。我们看下面这张图片&#xff0c;我们要识别出这些图片都是0并不难&#xff0c;要怎么交给计算机&#xff0c;让计算机和我们得出同样的结果&#xff1f;难点就在于模式识别的答案不标准&…

十二、Nacos源码系列:Nacos配置中心原理(四)- RefreshEvent 事件处理

前面文章&#xff0c;我们说到回调监听器的方法中&#xff0c;主要就是发布了一个RefreshEvent事件&#xff0c;这个事件主要由 SpringCloud 相关类来处理。今天我们继续分析后续的流程。 RefreshEvent 事件会由 RefreshEventListener 来处理&#xff0c;该 listener 含有一个 …

Object类方法

toString(): 返回对象的字符串表示形式。默认情况下&#xff0c;返回对象的类名和哈希码的十六进制表示。 equals(Object obj): 比较两个对象是否相等。默认情况下&#xff0c;这个方法比较的是两个对象的引用是否相同&#xff0c;但是通常会在子类中重写这个方法以实现自定义…

武器大师——操作符详解(下)

目录 六、单目操作符 七、逗号表达式 八、下标引用以及函数调用 8.1.下标引用 8.2.函数调用 九、结构体 9.1.结构体 9.1.1结构的声明 9.1.2结构体的定义和初始化 9.2.结构成员访问操作符 9.2.1直接访问 9.2.2间接访问 十、操作符的属性 10.1.优先性 10.2.结合性 …

sql基本语法+实验实践

sql语法 注释&#xff1a; 单行 --注释内容# 注释内容多行 /* 注释内容 */数据定义语言DDL 查询所有数据库 show databases;注意是databases而不是database。 查询当前数据库 select database();创建数据库 create database [if not exists] 数据库名 [default charset 字符…

备战蓝桥杯Day22 - 计数排序

计数排序问题描述 对列表进行排序&#xff0c;已知列表中的数范围都在0-100之间。设计时间复杂度为O(n)的算法。 比如列表中有一串数字&#xff0c;2 5 3 1 6 3 2 1 &#xff0c;需要将他们按照从小到大的次序排列&#xff0c;得到1 1 2 2 3 3 5 6 的结果。那么此时计数排序是…

一:面试流程

面试 项目介绍功能测试接口测试性能测试测试用例 项目介绍 南网智搜是南方电网公司研发的搜索引擎&#xff0c;主要场景Web 端场景有搜索频道、个人中心、和一些积分活动等&#xff0c;我在里面主要负责功能测试&#xff0c;接口测试&#xff0c;性能测试&#xff0c;压力测试…

Jetson Xavier NX 开发板Ubuntu18.04 安装arduino IDE详细步骤

Jetson 平台是arch架构&#xff0c;官网上面几乎都是x86或者arm64的这两种错误版本都存在匹配问题无法使用&#xff0c;不要下载不要下载&#xff01; uname -a #版本查询1.正确下载打开方式 https://downloads.arduino.cc/arduino-1.8.19-linuxaarch64.tar.xz选择自己想要下…

LeetCode #104 二叉树的最大深度

104. 二叉树的最大深度 题目 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出&#xff1a;2 分析 …

【Godot4自学手册】第十九节敌人的血量显示及掉血特效

这一节&#xff0c;我主要学习敌人的血量显示、掉血显示和死亡效果。敌人的血量显示和主人公的血量显示有所不同&#xff0c;主要是在敌人头顶有个红色的血条&#xff0c;受到攻击敌人的血条会减少&#xff0c;并且有掉血数量的文字显示&#xff0c;效果如下&#xff1a; 一、…

《中华人民共和国消防法》(2021年修订版)解读

单选题&#xff08;共7题&#xff0c;每题5分&#xff09; 1、举办大型群众性活动&#xff0c;承办人应当依法向&#xff08;&#xff09;申请安全许可。 正确答案&#xff1a;B、公安机关 2、违反消防安全规定进入生产、储存易燃易爆危险品场所的&#xff0c;情节严重的要处…

基于springboot+vue的医院后台管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

胎神游戏集第一期

目录 一、变色小跳龙 二、超级按钮 三、超级迷宫 四 、城市守卫战 五、 愤怒的小胎 既然是胎神游戏集&#xff0c;那当然要先感谢我们的胎神大大了 胎神洛谷名&#xff1a;TSzza 好了&#xff0c;言归正传&#xff0c;知道你们不喜欢啰嗦&#xff0c;直接上代码 一、…

SMBGhost漏洞技术分析与防御方案

事件分析 最近国内外各安全厂商都发布了SMBGhost(CVE-2020-0796)漏洞的预警报告和分析报告&#xff0c;笔者利用周末休息时间也研究了一下&#xff0c;就算是做一个笔记了&#xff0c;分享给大家一起学习下&#xff0c;目前外面研究的POC大部分是通过SMB压缩数据包长度整数溢出…