不要睡觉啦Zzzzzz,来一起学习冒泡排序吧Oooooo

本文详细介绍了冒泡排序的原理和步骤,通过一个具体的例子展示了如何对一组数字进行排序。冒泡排序中,每趟排序会比较相邻元素,确保较大的元素逐渐向后移动,直到数组有序。此外,解释了在C语言中,数组作为参数传递时会发生降级,实际上传递的是数组首元素的地址。文章还提到了`sizeof`运算符在不同情况下的行为,并强调了在计算数组元素个数时的注意事项。

冒泡排序,法如其名,就是类似于冒泡一样将数字按照大小排号顺序:

    就拿9,8,7,6,5,4,3,2,1,0这十个数字举例,如果我们想要把它按照从小到大的顺序排序,那怎么办呢?

    首先从第一个数字9开始,9先和右边第一个数字8比较,发现8比9小,然后将8与9调换位置;这时9在第二个,一趟还没有结束,所以继续比较,发现7也比9小,然后将7与9调换位置,就这样一直两个两个比较下去,直到最后一个,冒泡排序一趟结束。

    如果我们要对2个数字排序的话,那么我们只需要一趟冒泡排序;对于3个数字的排序,我们只需要两趟冒泡排序;那么以此类推,对于n个数字的排序,我们只需要n-1趟冒泡排序

了解以上基本信息之后,我们可以开始进行正式的程序编写:

    首先是主函数:我们给定需要进行排序的数组,接着通过sizeof计算数组元素的个数并定义为整数sz,即为int sz = sizeof(arr)/sizeof(arr[0]);接着,我们需要调用冒泡排序函数bubble_sort对数组中的数字进行排序,然后调用print_arr函数将数组打印出来。

    接着我们对冒泡排序函数bubble_sort进行函数定义:由于冒泡排序只需要对数组中的数字进行排序,因此它并不需要返回值。函数参数为数组arr与数组所含字符个数,因此函数括号内要写为(int arr[ ],int sz),n个数字排序需要n-1趟冒泡排序,每一趟都要再对数字进行一一比较,因此我们选择for循环

    因为排序趟数是数字个数-1,所以定义趟数i,由于i从0开始,因此I < sz-1即为sz-1趟;每一趟的元素序号我们定义为j,j仍旧是从0开始,j<sz-1,只是每趟冒泡排序需要进行排序的元素个数不同,我们对sz-1再减去一个i,即为j<sz-1-i,接着在循环中判断两个数的大小是否满足条件,若满足则进行调换,两个元素进行调换时可以借助中间变量tmp

    下面我们需要对print_arr进行定义,这个函数的作用其实就是将数组内的元素依次打印出来,那么数组中有sz个元素,从0开始,我们需要一个for循环,循环sz次。最好在打印好本数组的元素后再打印一个换行符。

最终打印结果:

那么这种情况成功之后,我们来看一下下面的这种方法:

当走过int sz = sizeof(arr)/sizeof(arr[0])时,我们发现sz这时等于2,这并非数组中元素个数,所以问题出在这里,那么,为什么会这样?

在bubble_sort中的形参arr本质上应该是一个指针;但是在主函数中arr是数组,数组传参的时候,数组名会发生降级,数组名降级变成了数组首元素地址,数组传参实际上传的是数组首元素地址。

绝大部分情况下,数组名是数组首元素的地址

但是有两个例外:

sizeof(数组名)————此时数组名表示的是数组首元素的地址,sizeof(数组名)计算的是整个数组的大小

&(数组名)————此时数组名表示整个数组,&数组名取出的是整个数组的地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拍拍脑袋瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值