当前位置: 首页 > article >正文

冒泡排序讲解

今天我们讲讲,冒泡排序,你以为我会说很多专业术语?错!请看下面的代码。

void bubble_score()//成绩排序
	{
		printf("准备成绩排序,基于冒泡排序……\n");
		for(int i=0;i<actnum-1;i++)//要比较的趟数,如果有n成绩,就有n-1趟要比较
			{
				
				for(int j=0;j<actnum-i-1;j++)//每少一趟就少一个要比较的
					{
						if(students[j][1]>students[j+1][1])
							{
						        int temid=students[j][0];//暂时记录学生学号
								int temscore=students[j][1];//暂时记录学生成绩
								students[j][0]=students[j+1][0];//将后一个学号覆盖前一个学生的学号
								students[j][1]=students[j+1][1];//将后一个成绩覆盖前一个学生的成绩
								students[j+1][0]=temid;//将之前暂时记录的学生学号向后一个同学覆盖
								students[j+1][1]=temscore;//将之前暂时记录的学生成绩向后一个同学覆盖
							}
					}
					
			}
	}

这个就是冒泡排序的基本形式其中,students这个数组,是一个二维数组,装着学号和成绩,嗯,不用过于纠结,这只是博主课堂作业里项目中关于冒泡排序的自定义函数,不能运行很正常,只是单纯的拿来当讲解素材使用。

接下来我们一部分一部分的解析冒泡排序。

首先讲:

 

首先这个for循环是拿来干什么的呢?

这里可以把actnum看作元素个数。

排序,不管是升序还是降序,它们元素之间总是要比较的,而冒泡排序的比较方式则是从下标零开始,两个元素之间进行比较,而这个for循环就是元素要比较的轮数,因为每个元素都要比较,所以有n个元素就要比较n-1轮,为什么要-1?因为每轮的排序都会一个选中最小或最大的数放在最后,当进行倒数第二轮完成的时候,最后一轮还有必要进行吗?

我们再来看看下一个for循环:

那么这个循环又肩负着怎样的重任呢?

就如上面说的,每一次比较都会一个选中最小或最大的数放在最后,那么当最大或者最小的元素被放到后面选中,她就不会再参加比较了,所以下标的范围就会对应的减少,总不能一次就把要减少的全部减完吧!省事也没有这么省事的啊!

所以我们在减1的基础上减上了i轮数,过了几轮就减几个元素下标

所以这个for循环主要就是圈定未确定的元素下标。

紧接着我们看看if语句的表达式:

它有扮演者什么角色呢?

它就相当于小说家们的审核人员一样,它觉得你满足条件了,合格了,才会安排的你的小说上进入阅读软件,给你放推荐一样,

同理if语句这里面的表达式就是冒泡排序中的判断条件,当然这里我做的是升序,所以当第一个元素大于第二个元素时就满足了条件,就可以进行交换了。

最后我们看看冒泡排序中的核心的部分:

 因为博主这个是二维数组,并且每个组成他的一维数组中有两个元素,所以是两个元素同时交换,咱们就看单数行就行了。

首先:

我们要创建一个临时空间temid,因为在计算机程序运行的过程中,并不会同时出现两个操作,指挥一个操作一个操作的进行,所以直接交换是不行的。

就像一个女海王同时有很多个男朋友,但和男朋友见面这种事,肯定只能一个一个见,不然结果可能不太美妙。(仅作比喻,没有任何其他意思哦!)

话归正题,所以在这里创建了一个临时空间,用来存放第一个元素的值

接下来:

 我们将第一个元素的拿出来之后,它就只剩下了一个空格(比喻不是真空了),此时我们将第二个元素的值装进这个空壳之中(也可以说是覆盖),再次剩下了第二个元素的空壳。

最后:

我们将之前存放在临时空间中的值,装进第二个元素这个空壳中(也可以说是重新赋值),这样交换就完成了 

相信看到这里,大家应该对冒泡函数有了一个大致的理解了,接下类我会多分享几章用冒泡排序的C语言练习,相信大家很快就能完全理解它。



http://www.kler.cn/a/393542.html

相关文章:

  • PNG图片批量压缩exe工具+功能纯净+不改变原始尺寸
  • Spring Boot 2.x 和 Druid 多数据源整合 dm
  • 【学习】Fine-tuning知识汇总
  • 【插件】多断言 插件pytest-assume
  • 大语言模型:解锁自然语言处理的无限可能
  • 【Pikachu】目录遍历实战
  • 【Linux取经之路】进程信号的保存
  • Python 正则表达式的一些介绍和使用方法说明(数字、字母和数字、电子邮件地址、网址、电话号码(简单)、IPv4 )
  • 报名开启|开放原子大赛“Rust数据结构与算法学习赛”
  • 吴恩达深度学习笔记(12)14
  • VBA高级应用30例应用3在Excel中的ListObject对象:插入行和列
  • 阿里云云效制品仓库(maven)私服配置快速入门
  • Linux软件包管理与Vim编辑器使用指南
  • 文件包含绕过(session打条件竞争应该是文件上传的!!!)
  • Python使用总结之如何去除图片的水印?
  • JavaScript入门笔记
  • SQL,力扣题目1107,每日新用户统计
  • Unity中实现战斗帧同步的高级技术
  • 网安加·百家讲坛 | 仝辉:金融机构鸿蒙应用安全合规建设方案
  • 重构代码之内联方法
  • 7、computed计算属性使用
  • 数据库参数备份
  • 爬虫开发工具与环境搭建——开发工具介绍
  • Spring Boot——日志介绍和配置
  • LeetCode 3249.统计好节点的数目:深度优先搜索(DFS)
  • WPF 中的视觉层和逻辑层有什么区别?