冒泡排序讲解
今天我们讲讲,冒泡排序,你以为我会说很多专业术语?错!请看下面的代码。
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语言练习,相信大家很快就能完全理解它。
完