【C语言从不挂科到高绩点】11-C语言中数组 02-冒泡排序

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节课开始重点给大家讲讲C语言中的数组

本套课程将会从0基础讲解C语言核心技术,适合人群:

  1. 大学中开设了C语言课程的同学
  2. 想要专升本或者考研的同学
  3. 想要考计算机等级证书的同学
  4. 想要从事C/C++/嵌入式开发的同学

================点个关注吧================

=========================================

6.4.1 数组初始化需要注意的问题

数组初始化时,可以只给部分元素赋值,当{}中的值少于元素的个数时,只给前面部分元素赋值,后面的元素会自动初始化为 0 值

#include <stdio.h>


int main(){

	//int ary[10] = {12,13,14};

	//float ary[10] = {3.14,5.12};

	char ary[10] = {'A','B'};

	int len = sizeof(ary)/sizeof(ary[0]);

	// 遍历数组
	for (int i = 0; i<len; ++i)
	{
		// printf("ary[%d]:%d\n",i, ary[i]);
		printf("ary[%d]:%c - %d\n",i, ary[i],ary[i]);  // 
	}
	return 0;
}

需要注意的问题:

  1. 取数组中的元素,一定要在数组下标范围内取获取,否则会取出未知区域中的数据,容易出错
  2. 当{}中的值的数量小于数组长度时,只给前面部分元素赋值,后面的元素会自动初始化为 0 值
    1. 对于 short,int,long 而言 0 值就是 0
    2. 对于 char 类型的数据来说,0 值就是空字符或者是 0
    3. 对于 float 和 double 类型来说,0 值就是 0.000000

6.4.2 数组元素的地址访问方式

数组名出现在表达式中,数组名代表的是数组首元素的地址,地址的占位符%p.

int ary[5] = {10,20,30,40,50};
#include <stdio.h>

int main(){


	int ary[5] = {10,20,30,40,50};


	printf("ary在内存中的地址:%p\n",ary );

	// & 表示取值对应的内存地址
	// & 叫做取址符(用来取数据在内存中的存储地址)
	// &ary[0] 表示取出arr[0]这个10数据在内存中的存储地址
	printf("ary[0]在内存中的地址:%p\n",&ary[0]);

	// 上面两个输出结果一样,我们得出,数组名在表达式中。其实就是数组首元素的地址
	return 0;
}

运行结果:

需要注意 的问题:

  1. ary 单独出现在表达式中,ary 就代表着数组的首元素的地址。
  2. ary+i 就表示将数组名从指向首元素的地址,向后移动 i 个地址,移动到下标为 i 元素的地址上。
  3. 所以我们可以使用元素的地址去遍历数组。

【参考代码】

#include <stdio.h>

int main(){


	int ary[5] = {10,20,30,40,50};


	printf("ary在内存中的地址:%p\n",ary );

	// & 表示取值对应的内存地址
	// & 叫做取址符(用来取数据在内存中的存储地址)
	// &ary[0] 表示取出arr[0]这个10数据在内存中的存储地址
	printf("ary[0]在内存中的地址:%p\n",&ary[0]);

	// 上面两个输出结果一样,我们得出,数组名在表达式中。其实就是数组首元素的地址
	printf("------------------------------\n");
	printf("ary[1]在内中的地址:%p\n",&ary[1]);
	// 使用数组名,取出第二个元素的地址
	printf("ary在内存中的地址:%p\n",ary+1); // ary+1 让数组名指向第二个元素

	printf("ary[2]在内中的地址:%p\n",&ary[2]);
	// 使用数组名,取出第二个元素的地址
	printf("ary在内存中的地址:%p\n",ary+2); // ary+2 让数组名指向第3个元素


	// 通过数组名(地址)取值
	// *地址 表示将地址中对应的值取出来
	// * 在这个地方表示取值符,表示从某个地址空间中取出值
	// *arr 表示将arr这个地址上对应的值取出来
	printf("ary 当前指向的数值:%d\n",*(ary+0) );//10

	printf("ary 当前指向的数值:%d\n",*(ary+1) );//20

	printf("ary 当前指向的数值:%d\n",*(ary+2) );//30

	printf("--------------------------------------\n");
	// 使用数据名作为地址的方式,遍历数组
	int len = sizeof(ary)/sizeof(int);
	for (int i = 0; i < len; ++i)
	{
		// 1. i=0  ary+0  -> 下标为0的元素地址
		// 2. i=1  ary+1  -> 下标为1的元素地址
		// 3. i=2  ary+2  -> 下标为2的元素的地址
		printf("ary 当前指向的数值:%d\n",*(ary+i) );// * 表示从对应地址中取出值
	}




	return 0;
}

6.4.3 数组排序:冒泡排序

冒泡排序的原理:

首先,第一个数和第二个数比较,如果第一个数比第二个数要大,两者交换位置,否则位置不动。然后比较第二个和第三个数,如果第二个比三个大,继续交换位置,依次往后比较

然后,经过第一轮比较,找到最大元素排到了最后。

然后每一轮按照形同的比较方式进行比较找到元素的最大值。

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

舞动排序算法:【罗马尼亚舞团】算法的艺术 - 冒泡排序_哔哩哔哩_bilibili

分析:

n 代表数组元素的个数,i 代表比较的轮次,j 代表每一轮比较的次数

  1. 最坏情况下:需要比较 i=n-1 轮
  2. 最坏情况下:每一轮比较的次数,j = n-1-i
  3. 冒泡排序中,前面数据比后面的数据值要大,他们要交换位置。如何交换两个变量的值

【参考代码】

#include <stdio.h>

int main(){
	int a = 20;
	int b = 30;

	// b=30  a=20
	int temp = 0;// 中间盘子

	// 将a的值保存到中间盘子
	temp = a;
	// 将b的值保存到a中
	a = b;
	// 再将中间盘子中,保存的a的值存入到b中
	b = temp;

	printf("a=%d ,b=%d\n", a,b);
	return 0;
}

尝试自己编写一下冒泡排序的代码:

提示:使用双重 for 循环,外层循环 i 表示比较的轮次,内层循环 j 表示每轮 比较的次数。

【参考代码】

#include <stdio.h>

int main(){

	int n = 0;
	printf("请输入数据个数:");
	scanf("%d",&n);

	// 用输入的个数,构建数组
	int ary[n];

	for (int i = 0; i < n; ++i)
	{
		printf("请输入%d个数据:", (i+1));
		scanf("%d",&ary[i]);
	}

	// 冒泡排序
	// 最外层的循环,比较轮次:最多比较n-1轮  (循环n-1)
	for (int i = 0; i < n-1; ++i)  // i表示第几轮
	{
		//内层循环,代表着每一轮比较的次数:最多比较的n-1-i次
		for (int j = 0; j < n-1-i; ++j) // j表示比较的第几次
		{
			// 前后进行比较,如果前面一个数比后面一个数大
			// 就交换位置
			if(ary[j]>ary[j+1]){
				int temp = ary[j];
				ary[j] = ary[j+1];
				ary[j+1] = temp;
			}
		}
	}

	// 遍历测试排序结果
	for (int i = 0; i < n; ++i)
	{
		printf("%d\t", ary[i]);
	}
	printf("\n");

	return 0;
}

当下排序方式是按照从小到大排序的,如果需要从大到小排,只需要将程序中的 ary[j]>ary[j+1] 修改成 ary[j]<ary[j+1] 即可。

 ----------------------------------------------------------------------

​分享不易,耗时耗力,喜欢的同学给个关注和赞吧

承接毕设指导,技术答疑,学习路上想要找私人教练的同学可以私信我

更多学习资料,公众号:墨轩学习网,B站:墨轩大楼

----------------------------------------------------------------------

另有下图需求的也记得私信我哟,专业班子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

听潮阁

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

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

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

打赏作者

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

抵扣说明:

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

余额充值