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

引言

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

一、冒泡排序的理论解析

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

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

  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.rhkb.cn/news/268302.html

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

相关文章

机器学习周报第31周

目录 一、论文阅读1.1 论文标题1.2 论文摘要1.3 论文背景1.4 提出的系统&#xff1a;MAER1.4.1 基于Asyncio的预处理1.4.2 多模态信号下的情感识别1.4.3 针对情感不匹配情况的自适应融合 一、论文阅读 1.1 论文标题 Beyond superficial emotion recognition: Modality-adapti…

Jmeter 安装

JMeter是Java的框架&#xff0c;因此在安装Jmeter前需要先安装JDK&#xff0c;此处安装以Windows版为例 1. 安装jdk&#xff1a;Java Downloads | Oracle 安装完成后设置环境变量 将环境变量JAVA_HOME设置为 C:\Program Files\Java\jdk1.7.0_25 在系统变量Path中添加 C:\Pro…

VS Code 的粘性滚动预览 - 类似于 Excel 的冻结首行

VS Code 的粘性滚动预览 - 类似于 Excel 的冻结首行功能&#xff0c;即滚动 UI 显示当前源代码范围。便于在代码行数比较多的时候更好的知道自己所在的位置。粘性滚动UI 显示用户在滚动期间所处的范围&#xff0c;将显示编辑器顶部所在的类/接口/命名空间/函数/方法/构造函数&a…

Dell R730 2U服务器实践3:安装英伟达上代专业AI训练Nvidia P4计算卡

Dell R730是一款非常流行的服务器&#xff0c;2U的机箱可以放入两张显卡&#xff0c;这次先用一张英伟达上代专业级AI训练卡&#xff1a;P4卡做实验&#xff0c;本文记录安装过程。 简洁步骤&#xff1a; 打开机箱将P4显卡插在4号槽位关闭机箱安装驱动 详细步骤&#xff1a; 对…

【java-面试题】链表刷题

【java-面试题】链表刷题 1. 删除链表中等于给定值 val 的所有节点&#xff08;最多遍历链表一遍&#xff09;题目思路代码 2. 反转一个单链表&#xff08;就地反转&#xff09; 1. 删除链表中等于给定值 val 的所有节点&#xff08;最多遍历链表一遍&#xff09; 力扣链接&am…

基于JSON的Ollama和LangChain agent

到目前为止&#xff0c;我们都可能意识到&#xff0c;通过为LLMs提供额外的工具&#xff0c;我们可以显著增强它们的功能。 例如&#xff0c;即使是ChatGPT在付费版本中也可以直接使用Bing搜索和Python解释器。OpenAI更进一步&#xff0c;为工具使用提供了经过优化的LLM模型&am…

GIT 卸载干净(图文详解)

一、控制面板卸载 右击卸载 等待卸载过程 二、在环境变量&#xff0c;把相关信息删除干净

巧妙解决接口测试产生脏数据问题

测试数据创建后需要对其删除&#xff0c;不然可能产生脏数据&#xff0c;对开发和测试、生产环境造成一定影响。 其接口框架是基于Python&#xff0c;API规范基于REST。 产生原因 改进前&#xff1a;清除资源的操作放在每个正向测试用例里&#xff0c;没有在setUp和tearDown…

使用 MongoDB Atlas 无服务器实例更高效地开发应用程序

使用 MongoDB Atlas无服务器实例更高效地开发应用程序 身为开发者&#xff0c;数据库并不一定需要您来操心。您可不想耗费时间来预配置集群或调整集群大小。同样地&#xff0c;您也不想操心因未能正确扩展而导致经费超标。 MongoDB Atlas 可为您提供多个数据库部署选项。虽然…

Vue路由(黑马程序员)

路由介绍 将资代码/vue-project(路由)/vue-project/src/views/tlias/DeptView.vue拷贝到我们当前EmpView.vue同级&#xff0c;其结构如下&#xff1a; 此时我们希望&#xff0c;实现点击侧边栏的部门管理&#xff0c;显示部门管理的信息&#xff0c;点击员工管理&#xff0c;显…

Vision Pro开发者学习路线

官方给到的Vision Pro开发者学习路线&#xff1a; 1. 学习基础知识&#xff1a; - 学习 Xcode、Swift 和 SwiftUI 的基础知识&#xff0c;包括语法、UI 设计等。 - 掌握 ARKit 和 SwiftUI 的使用&#xff0c;了解如何创建沉浸式增强现实体验。 2. 学习 3D 建模&#xf…

【latex】\IEEEpubid版权声明与正文内容重叠

问题描述 撰写IEEE Trans论文时&#xff0c;出现版权声明文字\IEEEpubid与正文内容重叠的问题&#xff1a; 原因分析&#xff1a; 在使用模板时&#xff0c;不小心将以下命令删除了&#xff1a; \IEEEpubidadjcol 解决方案&#xff1a; 在需要换页的位置附近添加以上命令&…

Appium自动化测试环境搭建

1、Appium简介 Appium是一个开源的&#xff0c;适用于原生或混合移动应用&#xff08; hybrid mobile apps &#xff09;的自动化测试平台,Appium应用WebDriver: JSON wire protocol驱动安卓和iOS移动应用。 2、环境配置 (1) 配置java环境 首先安装jdk。安装完成后新建用户…

【算法大家庭】动态规划算法

目录 &#x1f9c2;1.动态规划思想 &#x1f32d;2.背包问题思路分析 &#x1f37f;3.代码实现 1.动态规划思想 将大问题划分为小问题进行解决&#xff0c;从而一步步获取最优解的处理算法适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的 2.背包问题思路分…

德人合科技 | 天锐绿盾终端安全管理系统

德人合科技提到的“天锐绿盾终端安全管理系统”是一款专业的信息安全防泄密软件。这款软件基于核心驱动层&#xff0c;为企业提供信息化防泄密一体化方案。 www.drhchina.com 其主要特点包括&#xff1a; 数据防泄密管理&#xff1a;天锐绿盾终端安全管理系统能够确保数据在创…

10.轮廓系数-机器学习模型性能的常用的评估指标

轮廓系数&#xff08;Silhouette Coefficient&#xff09;是评估聚类算法效果的常用指标之一。它结合了聚类的凝聚度&#xff08;Cohesion&#xff09;和分离度&#xff08;Separation&#xff09;&#xff0c;能够量化聚类结果的紧密度和分离度。 背景 1.聚类分析的背景 在…

蓝桥杯算法题汇总

一.线性表&#xff1a;链式 例题&#xff1a;旋转链表 二.栈&#xff1a; 例题&#xff1a;行星碰撞问题 三.队列 三.数组和矩阵 例题&#xff1a; 四.哈希表 五.二叉树 主要方法是递归 主要考察点是遍历&#xff1a;前序&#xff0c;中序&#xff0c;后序遍历&#xff0c;层…

C习题002:澡堂洗澡

问题 输入样例 在这里给出一组输入。例如&#xff1a; 2 5 1 3 3 2 3 3 输出样例 在这里给出相应的输出。例如&#xff1a; No代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 代码 #include<stdio.h> int main() {int N,W,s,t,p;int arr_s[…

解决:Information:java: javacTask: 源发行版 8 需要目标发行版 1.8

解决&#xff1a;Information:java: javacTask: 源发行版 8 需要目标发行版 1.8 先点击 Project Structure 查看jdk是否为1.8版本 我这jdk版本为1.8版本的&#xff0c;但还是运行还是报错 据以上错误显示以及上述配置&#xff0c;我选择的编译器是jdk1.8的&#xff0c;但是在i…

2.模拟问题——3.叠筐

【原题链接】 分析 题目含义 根据题目要求&#xff0c;即要将中心值放在正方形框正中心&#xff0c;然后依次轮换在外层围上另一个边缘值&#xff0c;围的时候边框要保证中心值和边缘值交替&#xff0c;所围图形保持为一个正方形&#xff0c;围完最后一圈后&#xff0c;需要…