c语言实现冒泡排序(超详细逐句讲解版)

今天来给大家分享一下c语言来实现冒泡排序,很多初学者听到这个名字后可能会脸上会露出惊喜的表情

d29d2de9c3594e66b1d45c4e0dfa7d37.png

其实只要搞懂了原理,代码还是很好理解的。所以既然是排序,那首先我们需要一组数,举个例子🙋

比如此时你想用冒泡排序对这样一组数进行排序:

10 9 8 7 6 5 4 3 2 1 ,很明显这是一组从大到小的数,你想把它排成从小到大的数

第一趟排序:

第一次比较:

那首先是第一个数和第二个数进行比较,谁比较小就把谁放在前面,10和9比较,9比较小,所以就把10和9交换位置,此时这组数变成了9 10 8 7 6 5 4 3 2 1

第二次比较:第二个数和第三个数进行比较,10和8比较,8比较小,所以我们把10和8交换位置,此时这组数变成了9 8 10 7 6 5 4 3 2 1

第三次比较:第三个数和第四个数进行比较,10和7进行比较,7比较小,所以我们把10和7交换位置,此时这组数变成了9 8 7 10 6 5 4 3 2 1

……

第十次比较:

此时这组数变成了9 8 7 6 5 4 3 2 1 10

然后我们可以得出一个结论☝️:

1.所谓的冒泡排序,就是让两两相临的元素进行比较

2.经过这么一趟排序下来,我们最终可以确定一个数字的最终位置,这组数如果按从小到大排序,最后一个位置就是10的最终位置

3.如果已经排完了前面所有的元素,那最后一个元素就不需要比较了,所以10个元素只需要9趟排序,那么如果有n个元素,就需要n-1趟排序。

(至于为什么叫冒泡排序,应该是数字经过比较之后一个一个冒到它最终的位置,叫冒泡有点子形象🤔罢了)

好了,言归正传,既然是比较一组数,那我们就需要创建一个整型(int)数组来存储这些数

6d70170ba30a4838a8d030aa3d516685.png

数组的大小可以自己定,这里我定的是10 ,然后下面的表达式计算的是数组的元素个数sz,这里是用整个数组的大小/数组中任意一个元素的大小,就可以算出数组的元素个数了。

sizeof计算的是变量或者类型所占空间的大小,单位是字节。这里我们创建的是一个整型数组,一个整型元素在内存中占4个字节,这里我们的数组里面共有10个整型元素,所以sizeof(arr)是10*4=40,然后sizeof(arr[0])计算的是数组里面第0个元素的大小,是4个字节,所以sz=40/4=10。

(可能一些同学会觉得有点有毛病😓,前面不是已经定了数组的元素个数是10了吗,为啥还要算。其实这里这么做是因为,如果后面要改这个数组的元素个数的话,之前改10那个地方就好了,其他用到这个数组的地方都不用改那个大小了,因为算出来的sz会根据你定的数字的变化而变化。)

然后接下来,可以用一个for循环来往这个数组里输入你需要的值

a9d47e4a42ea448bbfe2ba82d11e3636.png

i在上面已经定义过了👆,这里可以输入你需要的10个数,每个数中间可以用一个空格隔开 (记得不要多敲,不然会运行结果出错,别问,问就是吃了很多亏😘)

c6202ecc0857427aab5b20fe563731e0.png

再然后呢,我们就调用冒泡排序的这个函数,是的,给它起个看起来不一般的函数名 bubble_sort(感觉自己一下多学了一个单词☝️),然后在后面的括号里记得写上参数哦。

这里我们需要浅浅思考一下🤔,首先我们要干啥?

我们要排序,那么排哪里的数?答得好!我们要排数组里面的数,那么我们是不是需要把这个数组先当作一个参数放进去呢。

然后我们还要干嘛?没错👍,我们还要比较里面的数,那么我们是不是在排序的时候还需要知道一共有多少个元素呢,所以我们也要把元素个数sz当作参数放进去。

再接着在冒泡排序的函数里排好顺序之后,我们就可以将这些数组中的元素用一个for循环打印出来了

(别问为什么还要打印,不打印出来你怎么看排好之后的数😧)

然后就完事了

9af6c8eb12cc4a509d8976ee5c8f796f.png

想的美,接下来我们还需要来实现一下这个冒泡排序的函数。

9243feff8bea412baf3771de660cb80c.png

好的,看过去第一行就马上发现了一个让人头疼的东西🤦 ,指针?为啥有指针?

浅浅科普一下,因为数组传参实际上传的是数组首元素的地址,所以这里是指针类型的(其实如果实在搞不懂也没事,先这么写,学到后面就懂了,这不是重点)

然后我们第一层的for循环是冒泡排序的总趟数,上面提到了10个元素一共要排9趟,这里的sz=10,sz-1就是9,小于9就是不包括9,所以这里是i的范围是0-8,一共就是9;

(为什么i要从0开始,因为数组下标是从0开始的)

一趟排序进去我们还要比较,第一趟我们需要比9次,第二趟比8次,第三趟比7次……我们可以发现比较的次数是在不断变化的,所以我们可以在后面减去i,因为i的值就是变化的6abc4a3e486b45ef9e96dbeefc67acfc.png

第一趟:i=0,j<sz-1-i=9,j的范围就是0-8

第二趟:i=1,j<sz-1-i=8,j的范围就是0-7


这样应该可以理解了吧宝子

眼睛亮👀的同学已经发现了那个flag,这里先不解释,稍等一下哈🤣

dec63506b8de479bae21625ddef2e975.png

这里终于来到了我们期待的条件判断部分,这里我们要排一个从小到大的顺序,所以arr[j]>arr[j+1]意思是,如果前面一个数比后面一个数大的话就执行里面的语句,里面的语句是交换两个数的值。

就是如果前面一个数比它后面的那个数大的话就交换它们的值,也就是两个数换个位置。

这部分如果有同学看不懂,我在另一条博客里有专门讲解交换两个数的代码,可以去看看👀。

再接着我们就可以填坑了,flag是干啥的。

我们是不是要考虑一种特殊的情况,如果提供的那个数组里面的数本来就是有序的,那就不用再进去挨个比较了。所以我们在第二层循环之前定义了一个flag变量,初值置为1,如果它本来就是有序的,那就不会满足if的条件判断,一旦可以满足后面的if的条件判断,就会执行break语句,直接跳出循环59f21d0ce973478daade7b8e715a9d15.png

 如果需要排序那就会满足第一个if的条件判断,然后执行完if里面的语句之后,flag的值会被置为0,不满足后面的if判断,只能乖乖去排序喽😝。

到此为止终于分享完了冒泡排序的代码,下面是完整的代码:

 47d7c1ba65cc4dd2a861edb5d57b52fb.png

9efb72f37d8d4315929188463bc04a76.png

5408ac669af54d59bc3edb5b5e37569f.png

本次分享就到此为止,如果对你有帮助的话,或许老铁们可以给博主一键三连浅浅鼓励一下呦!

  • 31
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值