《C语言初阶》 第四部分 数组(下)---冒泡排序

大家好,这篇文章继续讲解C语言数组的知识,这篇文章可是非常重要。
话不多说,让我们开始吧。

在这里插入图片描述
数组作为函数参数
往往我们在写代码的时候,会将数组作为参数传给函数,比如:我要实现一个冒泡排序(这里要讲算法思想)函数将一个整形数组排序。那我们该如何写出正确的代码呢?
首先我们说两个易错点:
1.数组名是首元素的地址(有两个例外,下面说)。
2.数组传参只需要写数组名,不要加[]。
好了,现在我们就说一下冒泡排序的思想:
两两相邻的元素进行比较,如果有可能的话需要交换
我们举个例子:
假设我们需要将9 8 7 6 5 4 3 2 1 0,让它升序。
首先,9和8相比,9>8,交换为8 9 7 6 5 4 3 2 1 0,然后9和7比较,9>7,交换为8 7 9 6 5 4 3 2 1。依此类推,最后为8 7 6 5 4 3 2 1 0 9。这样一轮下来,最大的数到最后了。所以第二轮的时候,我们只需要排8 7 6 5 4 3 2 1 0,这些数就行了。然后我们再让8和7进行比较,依此类推。最后为7 6 5 4 3 2 1 0 8 9。
所以我们可以得出一个结论:一轮比较我们可以搞定一个数字。
那10个元素,我们要进行多少轮比较呢?答案是9轮。
因为搞定9个元素,最后一个元素肯定在正确的位置上。
如果是n个元素,那要进行n-1轮比较。
所以我们必须要知道数组有多少元素。
好了,那我们将下面数组排个序吧:

int arr[] = { 3,1,5,2,4,9,0,7,6,8 };

首先,我们要知道数组的元素个数。数组的元素个数怎么求呢?

int sz = sizeof(arr)/sizeof(arr[0]);

这里是整个数组的大小/数组一个元素的大小,得数组的个数。然后作为参数传过去。
代码如下:
在这里插入图片描述
所以sz个元素,进行sz-1轮比较。
在这里插入图片描述
然后,进入循环后,就是一轮比较的过程了。
因为每一轮比较后,最后一个元素就不需要比较了,所以每一轮都少一次比较。
第一轮时,10个元素,9次比较。
第二轮时,9个元素,8次比较。

第九轮时,2个元素,1次比较。
每一次我们都要用下标来比较,首先下标0和下标1的元素比较,然后下标1和下标2的元素进行比较,不断变化。
在这里插入图片描述
那j的判断条件这么写呢?我们写出j<sz-1-i行不行。
当第一轮时,i为0,j<9,比较9次。
当第二轮时,i为1,j<8,比较8次。
当第三轮时,i为2,j<7,比较7次。

所以代码如下:
在这里插入图片描述
这里我们说一个易错点:
可能初学者不将sz作为参数传给函数,而是在函数内部直接求的。
在这里插入图片描述
这其实是有错误的。我们可以测试一下:
在这里插入图片描述
我们可以看到这样求sz为1,而不是10。
原因是:实际上,数组传参传递的是数组首元素地址,所以sizeof(arr),求的是这个地址的大小,在32位机器上大小为4个字节。arr[0]是整型,是4个字节。所以4/4=1。那为什么是地址,形式参数写成数组的形式也正确,这是因为C语言设计者为了初学者更好理解而这样设计的,语法上是支持的。

好了,现在大家可能对数组名产生了疑惑:数组名到底是什么?
我们来看一下这两个代码:
在这里插入图片描述
我们发现数组名和数组第一个元素地址是一样的,但是又两个例外。
我们看一下这个代码:

int arr[10] = {0};
printf("%d\n", sizeof(arr));

如果数组名是首元素地址,那么为什么输出的结果是:40?
补充:
1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组

总结:
到这里,我们数组作为函数参数和冒泡排序的一些知识已经说完。如果大家认为我有哪些不足之处或者知识上的错误都可以告诉我,我会在之后的文章中不断改正,也请大家多多包。如果大家觉得这篇文章有用的话,也希望大家可以给我关注点赞,你们的支持就是对我最大的鼓励,我们下一篇文章再见。
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学代码的咸鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值