自学内容网 自学内容网

冒泡排序讲解

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

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语言练习,相信大家很快就能完全理解它。



原文地址:https://blog.csdn.net/wangjing_0522/article/details/143779334

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!