今天来给大家分享一下c语言来实现冒泡排序,很多初学者听到这个名字后可能会脸上会露出惊喜的表情
其实只要搞懂了原理,代码还是很好理解的。所以既然是排序,那首先我们需要一组数,举个例子🙋
比如此时你想用冒泡排序对这样一组数进行排序:
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)数组来存储这些数
数组的大小可以自己定,这里我定的是10 ,然后下面的表达式计算的是数组的元素个数sz,这里是用整个数组的大小/数组中任意一个元素的大小,就可以算出数组的元素个数了。
sizeof计算的是变量或者类型所占空间的大小,单位是字节。这里我们创建的是一个整型数组,一个整型元素在内存中占4个字节,这里我们的数组里面共有10个整型元素,所以sizeof(arr)是10*4=40,然后sizeof(arr[0])计算的是数组里面第0个元素的大小,是4个字节,所以sz=40/4=10。
(可能一些同学会觉得有点有毛病😓,前面不是已经定了数组的元素个数是10了吗,为啥还要算。其实这里这么做是因为,如果后面要改这个数组的元素个数的话,之前改10那个地方就好了,其他用到这个数组的地方都不用改那个大小了,因为算出来的sz会根据你定的数字的变化而变化。)
然后接下来,可以用一个for循环来往这个数组里输入你需要的值
i在上面已经定义过了👆,这里可以输入你需要的10个数,每个数中间可以用一个空格隔开 (记得不要多敲,不然会运行结果出错,别问,问就是吃了很多亏😘)
再然后呢,我们就调用冒泡排序的这个函数,是的,给它起个看起来不一般的函数名 bubble_sort(感觉自己一下多学了一个单词☝️),然后在后面的括号里记得写上参数哦。
这里我们需要浅浅思考一下🤔,首先我们要干啥?
我们要排序,那么排哪里的数?答得好!我们要排数组里面的数,那么我们是不是需要把这个数组先当作一个参数放进去呢。
然后我们还要干嘛?没错👍,我们还要比较里面的数,那么我们是不是在排序的时候还需要知道一共有多少个元素呢,所以我们也要把元素个数sz当作参数放进去。
再接着在冒泡排序的函数里排好顺序之后,我们就可以将这些数组中的元素用一个for循环打印出来了
(别问为什么还要打印,不打印出来你怎么看排好之后的数😧)
然后就完事了
想的美,接下来我们还需要来实现一下这个冒泡排序的函数。
好的,看过去第一行就马上发现了一个让人头疼的东西🤦 ,指针?为啥有指针?
浅浅科普一下,因为数组传参实际上传的是数组首元素的地址,所以这里是指针类型的(其实如果实在搞不懂也没事,先这么写,学到后面就懂了,这不是重点)
然后我们第一层的for循环是冒泡排序的总趟数,上面提到了10个元素一共要排9趟,这里的sz=10,sz-1就是9,小于9就是不包括9,所以这里是i的范围是0-8,一共就是9;
(为什么i要从0开始,因为数组下标是从0开始的)
一趟排序进去我们还要比较,第一趟我们需要比9次,第二趟比8次,第三趟比7次……我们可以发现比较的次数是在不断变化的,所以我们可以在后面减去i,因为i的值就是变化的
第一趟:i=0,j<sz-1-i=9,j的范围就是0-8
第二趟:i=1,j<sz-1-i=8,j的范围就是0-7
…
这样应该可以理解了吧宝子
眼睛亮👀的同学已经发现了那个flag,这里先不解释,稍等一下哈🤣
这里终于来到了我们期待的条件判断部分,这里我们要排一个从小到大的顺序,所以arr[j]>arr[j+1]意思是,如果前面一个数比后面一个数大的话就执行里面的语句,里面的语句是交换两个数的值。
就是如果前面一个数比它后面的那个数大的话就交换它们的值,也就是两个数换个位置。
这部分如果有同学看不懂,我在另一条博客里有专门讲解交换两个数的代码,可以去看看👀。
再接着我们就可以填坑了,flag是干啥的。
我们是不是要考虑一种特殊的情况,如果提供的那个数组里面的数本来就是有序的,那就不用再进去挨个比较了。所以我们在第二层循环之前定义了一个flag变量,初值置为1,如果它本来就是有序的,那就不会满足if的条件判断,一旦可以满足后面的if的条件判断,就会执行break语句,直接跳出循环
如果需要排序那就会满足第一个if的条件判断,然后执行完if里面的语句之后,flag的值会被置为0,不满足后面的if判断,只能乖乖去排序喽😝。
到此为止终于分享完了冒泡排序的代码,下面是完整的代码:
本次分享就到此为止,如果对你有帮助的话,或许老铁们可以给博主一键三连浅浅鼓励一下呦!