【C 语言】深入理解冒泡排序算法

0. 前言

冒泡排序是一种经典且基础的排序算法。它虽然在效率上并非最优,但对于初学者理解排序的基本概念和逻辑有着重要的意义。

1. 冒泡排序的基本思想

冒泡排序的基本思想是通过反复比较相邻的元素并交换它们(如果顺序错误),就像水中的气泡一样,较小的元素会逐渐“浮”到数组的前端,较大的元素则“沉”到数组的后端

我们来看一个例子:

待排序数组:【8 7 4 3 2】 现在需要升序排列 

第一趟排序:

第1次先将最前面的两个数8和7对调。第2次将第2和第3个数(7和4)对调…如此共进行4次,得到7 4 3 2 8的顺序,可以看到:最大的数8已“沉底”,成为最下面一个数,而小的数“上升”。最小的数2已向上“浮起”一个位置。经过第1(共4比较与交换)后,已得到最大的数8。如图所示

然后进行第2趟比较,对剩下的前面4个数(7,4,3,2)进行新一轮的比较,使第二大的数“沉底”。同样按照上面方法进行第2趟比较。经过这一趟3次比较与交换,得到次大的数7.

按此规律进行下去,可以推知,对5个数需要比较4趟,才能使5个数按从小到大排列。

在第1趟中要进行两个数之间的比较共4次,在第2趟过程中比较3次…第4趟只须比较1次。

总结一下:

如果一个数组中有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,

在第i趟比较中要进行n-i次两两比较。

具体冒泡的方式:

用相邻的两个元素进行比较,前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾。

代码实现: 

//冒泡排序
void BubbleSort(int arr[], int sz)
{// 外层循环控制冒泡排序的趟数// sz-1表示:最后一趟区间中只剩余1个元素,该趟冒泡可以省略for (int i = 0; i < sz - 1; i++){// 具体冒泡的方式:用相邻的两个元素进行比较,//前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾for (int j = 1; j < sz - i; j++){if (arr[j - 1] > arr[j]){int tmp = arr[j - 1];arr[j - 1] = arr[j];arr[j] = tmp;}}}
}int main()
{int arr[] = { 8,7,4,3,2 };int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;BubbleSort(arr, sz);//调用函数for (i = 0; i < sz; i++){printf("%d ", arr[i]);//排序后输出}return 0;
}

运行一下看看

 是我们想要的效果! 确实排成升序了

2. 优化 

假设我们的待排数组是【1,3,5,7,9】,要排序升序,我们发现已经是升序排列的了

如果还要按照冒泡排序进行两两交换的话,效率就很慢了~

原来,冒泡排序也有它的短板,不管是什么样的数据,即使已经排好序了,但仍是会进行后边的比较,直到全部比较完成

因此,我们可以对代码进行优化,如果发现在某趟排序中,没有发生一次交换,

可以提前结束冒泡排序。

解决方式:可以通过一个标志位flag来进行判断

//冒泡排序
void BubbleSort(int arr[], int sz)
{int flag = 0;//定义一个标志位,用于判定元素之间是否进行了交换// 外层循环控制冒泡排序的趟数// sz-1表示:最后一趟区间中只剩余1个元素,该趟冒泡可以省略for (int i = 0; i < sz - 1; i++){// 具体冒泡的方式:用相邻的两个元素进行比较,//前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾for (int j = 1; j < sz - i; j++){if (arr[j - 1] > arr[j]){int tmp = arr[j - 1];arr[j - 1] = arr[j];arr[j] = tmp;}}//在进行完一轮的排序之后,判断本轮是否发生了元素之间的交换//如果没有发生交换,说明数组已经是有序的了,则直接结束排序if (!flag){break;}else{//如果发生了交换,那么在下一轮排序之前将flag再次置为0//以便记录下一轮排序的时候是否会发生交换flag = 0;}}
}

这样,冒泡排序的效率会得到一定效率的提升。

3. 冒泡排序的时间复杂度和空间复杂度

这里我们浅浅了解下冒泡排序的时间复杂度和复杂度,到数据结构部分我们会详细探讨~

1. 冒泡排序的时间复杂度为  ,这是因为在最坏情况下,需要进行  次比较和交换操作。

2. 空间复杂度为  ,因为它只在原数组上进行操作,不需要额外的存储空间。

4、冒泡排序的优缺点

优点:

  1. 实现简单,逻辑清晰,易于理解和实现。
  2. 对于小型数据集,性能尚可。

缺点:

  1. 时间复杂度较高,对于大型数据集效率低下。
  2. 比较和交换操作较多,相对较耗时。

5. 总结

冒泡排序虽然在效率上不如一些高级排序算法,但作为学习排序算法的基础,它有助于我们理解排序的基本概念和原理。在实际应用中,根据数据规模和性能要求,我们可以选择更适合的排序算法。

希望通过这篇文章,您会对冒泡排序有个初步的理解!等未来我们学习更多排序算法,

会进一步对比各种排序算法的效率,你会了解更爱深入的!

以上是本期博客分享的内容,希望对你学习有帮助!ღ( ´・ᴗ・` )


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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

使用Chainlit接入通义千问快速实现一个多模态的对话应用

开通灵识服务 首先需要到阿里云-模型服务灵积开通账户&#xff0c;获得apiKey 模型服务灵积 https://dashscope.aliyun.com/ 进入控制台 &#xff0c;在API-KEY管理里&#xff0c;创建一个新的API-KEY,然后保存起来&#xff0c;后面会用到。 模型服务灵积服务所有API文档地址…

USB 接口小科普

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 文章目录 目录 1. 基础概念 2. USB 接口 3. USB 传输标准 3.1 USB 传输速率 3.2 雷电技术 4 USB 总结 Hi&…

MyBatis-Plus知识总结

1. MP前瞻 官网&#xff1a;https://baomidou.com/ 1、MyBatis-Plus是什么&#xff1a;MyBatis-Plus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;它在MyBatis的基础上只做增强不做改变&#xff0c;为简化开发、提供效率而生。并且MP内部提供了丰富的 AP…

企业数据防泄密软件知多少

企业数据防泄密软件是保护企业或组织内部敏感信息不被非法泄露的重要技术工具。加密系统功能多样&#xff0c;通过该系统来监控、管理和保护数据&#xff0c;确保数据在内部网络、终端设备以及互联网上的安全传输和存储。 一、企业数据防泄密软件详解&#xff08;主要功能&…

arduino程序-程序函数2(led电路及相关函数)(基础知识)

arduino程序-程序函数2&#xff08;led电路及相关函数&#xff09;&#xff08;基础知识&#xff09; 1-9 程序函数2&#xff08;led电路及相关函数&#xff09;点亮LED需要Blink程序PinMode(LED_BUTTIN,OUTPUT)DigitalWrite(LED_BUILTIN,HIGH)第一个参数(13/LED_BUILTIN)第二个…

QT——信号和槽学习笔记

Qt 信号和槽 信号和槽&#xff08;Signals and Slots&#xff09;是Qt框架中的核心机制之一&#xff0c;用于对象之间的通信。它们提供了一种非常灵活和类型安全的事件处理系统&#xff0c;允许对象之间在发生特定事件时进行交互&#xff0c;而不需要紧密耦合。这使得代码更易…

App尺寸:5个创新方法,提升界面吸引力

当用户打开应用程序时&#xff0c;应用程序图标是用户认知品牌的第一个门槛&#xff0c;可以直接影响用户对应用程序的第一印象。应用程序图标尺寸直接影响应用程序图标的视觉效果&#xff0c;这也是决定用户是否愿意下载应用程序图标的关键因素。应用程序图标尺寸规范在图标设…

SEO优化 prerender-spa-plugin工具使用 踩坑记录

安装prerender-spa-plugin yarn add prerender-spa-plugin 或 npm install prerender-spa-plugin初始配置 后面记录踩的坑 配置路由 const routes [{path: /,redirect: {path: /HomeView},},{path: /home,redirect: {path: /HomeView},},{ path: /HomeView,component: HomeV…

Linux 用户管理模式

目录 1. 概述 2. 管控级别 3. 用户组管理 4. 用户管理 4.1 创建用户 useradd 4.2 删除用户 userdel ​编辑4.3 查看用户所属组 id 4.4 修改用户所属组 usermod 5. 查看用户/用户组 5.1 查看系统用户 5.2 查看系统用户组 1. 概述 Linux 可以配置多个用户&#xff0c…

C# 调用Webservice接口接受数据测试

1.http://t.csdnimg.cn/96m2g 此链接提供测试代码&#xff1b; 2.http://t.csdnimg.cn/64iCC 此链接提供测试接口&#xff1b; 关于Webservice的基础部分不做赘述&#xff0c;下面贴上我的测试代码&#xff08;属于动态调用Webservice&#xff09;&#xff1a; 1&#xff…

ros笔记04--从零体验ros2行为通信方式

ros笔记04--从零体验ros2行为通信方式 介绍创建步骤体验官方案例基于python开发行为案例创建action接口创建action sever和client 注意事项说明 介绍 行为是ros2中的一种通信方式&#xff0c;其多被用于一些长时间运行的任务&#xff0c;它包含了目标、反馈、结果三部分。 行为…

Qt Creator使用git管理代码

1.在GitHub中新建仓库&#xff0c;设置好仓库名后&#xff0c;其它的设置默认即可。 2.打开git bash&#xff0c;输入以下命令&#xff1a; git config --global user.name "xxxxx" #设置你的GitHub用户名 git config --global user.email "xxxxxxxxx.…

79.WEB渗透测试-信息收集-框架组件识别利用(3)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;78.WEB渗透测试-信息收集-框架组件识别利用&#xff08;2&#xff09;-CSDN博客 struts2…

GPT-4o mini- 开发者的新宠儿

在人工智能的浪潮中,一颗新星正在冉冉升起。OpenAI最新发布的GPT-4o mini模型以其惊人的性能和极具竞争力的价格,正在成为开发者们的新宠儿。作为一名大数据开发者,我深深被这个"迄今为止最具成本效益的小模型"所吸引。让我们一起探索GPT-4o mini的魅力,看看它如何改…

docker(一):Develop faster. Run anywhere.

前言 在进行微服务部署时&#xff0c;首先需要进行部署环境的搭建。目前&#xff0c;Docker 已经成为了微服务部署的主流解决方案之一。Docker 可以帮助我们更快地打包、测试以及部署应用程序&#xff0c;从而缩短从编写到部署运行代码的周期。 在本文中&#xff0c;我们将对…

ITSS:IT服务工程师

证书亮点&#xff1a;适中的费用、较低的难度、广泛的应用范围以及专业的运维认证。 总体评价&#xff1a;性价比良好&#xff01; 证书名称&#xff1a;ITSS服务工程师 证书有效期&#xff1a;持续3年 培训要求&#xff1a;必须参加培训&#xff0c;否则将无法参与考试 发…

软件-vscode-plantUML-IDEA

文章目录 vscode基础命令 实操1. vscode实现springboot项目搭建 &#xff08;包括spring data jpa和sqlLite连接&#xff09; PlantUMLIDEA下载及安装Eval Reset插件配置修改IDEA创建项目的默认目录IDEA配置gitIDEA翻译插件translationIDEA断点调试IDEA全局搜索快捷键不能使用代…

人工智能学习笔记 - 初级篇Ⅱ - 图形可视化 - 第11节: 绘制带填充区域的图表

微信公众号&#xff1a;御风研墨 关注可了解更多。问题或建议&#xff0c;请公众号留言 文章目录 绘制带填充区域的图表应用背景准备工作操作步骤工作原理补充说明最后 绘制带填充区域的图表 应用背景 在数据可视化中&#xff0c;带填充区域的图表可以有效地表示数据范围、趋…

springBoot 3.X整合camunda

camunDa camunDa 是2013年从Activiti5 中分离出来的一个新的工作流引擎。Camunda 官方提供了 Camunda Platform、Camunda Modeler&#xff0c;其中 Camunda Platform 以 Camunda engine 为基础为用户提供可视化界面&#xff0c;Camunda Modeler 是流程文件建模平台&#xff0c…

FMEA在光伏电站安全生产管理中的应用

在绿色能源浪潮席卷全球的今天&#xff0c;光伏电站作为清洁能源的重要支柱&#xff0c;其安全高效运行直接关系到能源供应的稳定与环境的可持续发展。然而&#xff0c;光伏电站的日常运营中潜藏着诸多风险与挑战&#xff0c;如何有效预防事故、保障人员安全及设备稳定运行&…