数组各类型空间地址解析、冒泡排序算法解析、函数在数组中的应用解析

博客主页:https://blog.csdn.net/weixin_46094737?type=blog
欢迎评论⭐留言  如有错误敬请指正!
本文由小学生廉原创,首发于 CSDN🙉🙉🙉
未来很长,值得我们全力奔赴更美好的生活!💞💞💞

首先上结论:

char类型数组地址空间大小为:

☆short类型数组地址空间大小为:2

☆int类型数组地址空间大小为:4

☆long类型数组地址空间大小为:4

☆long long类型数组地址空间大小为:8

接下来我们在编程中把它打印出来(以16进制数打印结果,#表示输出为16进制,p表示查询地址) 。

sizeof:地址大小 

#include <stdio.h>

int main()
{
	int i;
	char arr01_5[5]={10,11,12,13,14};//char类型数组的地址空间(房间容量为1) 
	printf("char类型的地址空间为:%d\n",sizeof(char));//每一个组数下标占1个字节(房间容量) 
	printf("arr01_[5]的地址空间为:%#p\n",&arr01_5[0]);//打印出数组下标0的地址空间(房间号) 
	printf("arr01_[5]的地址空间为:%#p\n",&arr01_5[1]);
	printf("arr01_[5]的地址空间为:%#p\n",&arr01_5[2]);
	printf("arr01_[5]的地址空间为:%#p\n",&arr01_5[3]);
	printf("arr01_[5]的地址空间为:%#p\n",&arr01_5[4]);
	for(i=0;i<5;i++)
	{
		printf("char类型数组下标%d的值为:%d\n",i,arr01_5[i]);	
	}
	
	short arr04_5[5];//short类型数组的地址空间(房间容量为2)
	printf("short类型数组的地址空间为:%d\n",sizeof(short));//每个数组下标占2个字节(房间容量) 
	printf("arr04_5[5]的地址空间为:%#p\n",&arr04_5[0]);
	printf("arr04_5[5]的地址空间为:%#p\n",&arr04_5[1]);
	printf("arr04_5[5]的地址空间为:%#p\n",&arr04_5[2]);
	printf("arr04_5[5]的地址空间为:%#p\n",&arr04_5[3]);
	printf("arr04_5[5]的地址空间为:%#p\n",&arr04_5[4]);
	
	int arr02_5[5];
	printf("int类型数组的地址空间为:%d\n",sizeof(int));
	printf("arr02_[5]的地址空间为:%#p\n",&arr02_5[0]);
	printf("arr02_[5]的地址空间为:%#p\n",&arr02_5[1]);
	printf("arr02_[5]的地址空间为:%#p\n",&arr02_5[2]);
	printf("arr02_[5]的地址空间为:%#p\n",&arr02_5[3]);
	printf("arr02_[5]的地址空间为:%#p\n",&arr02_5[4]);
	
	long arr03_5[5];
	printf("long类型数组的地址空间为:%d\n",sizeof(long));
	long long arr05_5[5];
	printf("long long类型数组的地址空间为:%d",sizeof(long long));
	
	return 0;
} 

打印结果如下: 

依据输出结果我们可以清晰的看到各个类型的数组空间大小(房间容量),简单明了。

利用函数调用数组求班级同学成绩的平均值:

#include <stdio.h>

void update(float arr_01[],int n);
float arr_avg(float arr[],int n);

int main()
{
	int i;
	float avg;
	float grade[4]={89.5,45.5,89.5,60.5};
	for(i=0;i<4;i++)
	 	printf("当前第%d位同学的成绩为%.1f\n",i+1,grade[i]);
	update(grade,4);//实参中直接调用(函数名字,元素数量) 
	for(i=0;i<4;i++)
	 	printf("修改后第%d位同学的成绩为%.1f\n",i+1,grade[i]);
	avg=arr_avg(grade,4);//实参中直接调用(函数名字,元素数量)无需重新指定类型,因为前面已经声明啦! 
	printf("平均成绩为:%.1f",avg);

	return 0;
}

void update(float arr_01[] ,int n)
{
	int i;
	for(i=0;i<4;i++)
		{
			printf("请重新输入第%d位同学的成绩:\n",i+1);
			scanf("%f",&arr_01[i]);	
		}
}

float arr_avg(float arr[],int n)
{
	int i;
	float ret=0;
	for(i=0;i<n;i++)
	{
		ret += arr[i];
	}	
	ret /= 4;
	
	return ret;
}

数组中的元素逆序排列算法:

#include <stdio.h>

void swap_arr(int a[],int n);
int main()
{
	int arr[5]={0};
	int i;
	for(i=0;i<5;i++)
	{
		printf("请输入第%d个元素的值\n",i);
		scanf("%d",&arr[i]);
		printf("第%d个元素的值arr[%d]=%d\n",i,i,arr[i]);
	}
	printf("\n");
	swap_arr(arr,5);
	for(i=0;i<5;i++)
	{
		printf("转换后第%d个arr[%d]=%d\n",i,i,arr[i]);	
	}
	
	return 0;
}

void swap_arr(int a[],int n)
{
	int i,temp;
	for(i=0;i<n/2;i++)
	{
		temp=a[n-i-1];
		a[n-i-1]=a[i];
		a[i]=temp;
	}	
}

核心算法就是数组中的第一个元素和最后一个元素交换,第二个元素和最后一个元素交换.....以此类推:

for(i=o;i<n/2;i++) 

        temp=a[n-i-1];

     a[n-i-1]=a[i];

  a[i]=temp;

在此基础上我们可以将此算法进行升华得到冒泡算法的核心。

 冒泡排序算法:

冒泡排序。就是它进行两个两个的比较如果发生了逆序,就进行交换。这里以大的数字放在最右边,小的在最左边先看一组数字:3,10,5,16,9,12,7
进行排序就是两两比较
第一次 3,5,10,9,12, 7, 16
第二次 3,5,9,10,7, 12 ,16
第三次 3,5,9,7,10 ,12 ,16
第四次 3,5,7,9,10, 12, 16

从这里我们就可以看出端倪,在整个的排序过程中,相邻两个进行比较的时候我们要使用一次内部循环,在进行排序操作的时候我们还需要进行一次外部循环,才可以最后得出结果。

源代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void swap(int arr_01[],int n);
void fuzhi(int arr_03[],int n);

int main()
{
	int i;
	int arr[10]={0};
	fuzhi(arr,10);
	for(i=0;i<10;i++)
	{
		printf("排序前(随机产生):arr[%d]=%d \n",i,arr[i]);
	}
	swap(arr,10);
	printf("\n");
	for(i=0;i<10;i++)
	{
		printf("排序后(升序排列):arr[%d]=%d \n",i,arr[i]);
	}
	return 0;
}
void fuzhi(int arr_03[],int n)
{
	int i;
	srand(time(0));
	for(i=0;i<n;i++)
	{
		arr_03[i]=rand()%99+1;
	}
}
	
void swap(int arr_01[],int n)
{
	int i,j,temp;
	for(i=0;i<n-1;i++)//比较的轮数 
	{
		for(j=0;j<n-1;j++)//每进行一轮比较,前一个小的元素和后一个较大的元素交换一下位置 
		{
			if(arr_01[j]>arr_01[j+1])
			{
				temp=arr_01[j];
				arr_01[j]=arr_01[j+1];
				arr_01[j+1]=temp;
			}	
		}	 
	}
}	

运行结果:

核心的算法就是利用了两次for循环:

	for(i=0;i<n-1;i++)//比较的轮数 
	{
		for(j=0;j<n-1;j++)//每进行一轮比较,前一个小的元素和后一个较大的元素交换一下位置 
		{
			if(arr_01[j]>arr_01[j+1])
			{
				temp=arr_01[j];
				arr_01[j]=arr_01[j+1];
				arr_01[j+1]=temp;
			}	
		}	 
	}

 起初我一直不太理解为啥要用到两次循环,这里借用一位博主的巧妙比喻,理解之后,便豁然开朗。

首先:嵌套是这么理解的。比如你有10棵树,每天都去检查是否生虫子了,连续检查一个月(30天)

循环就是这样:

for(j=1;j<=30;j++)

{

        for(i=1;i<=10;i++)

        {

                print("今天是第%d天, 正在检查第%d棵树",j,i);

        }

}

外层循环用户控制天,内层循环用于控制树,缺一不可,第一天检查十遍,第二天检查十遍,...

也就是j=1的时候内层循环执行一遍,j=2的时候内层循环执行一遍...

对于冒泡排序,可以这样考虑:

外层循环式控制一共有多少个泡需要排序, 这个当然要用循环,内层循环控制把某一个泡放到正确的位置, 这个也要用循环, 因为这个泡要和所有未排序泡比较一遍, 然后才能知道自己应该处的位置

这里有两个点,明白了的话,这道题就明白了。

1. 外层循环: 仅仅控制一共有多少个泡需要排序, 比如代码中a[10], 一共是10个元素

2. 内层循环: 仅仅控制把当前最大的泡放到最后, 也就是一次内层循环,仅仅把最大的那个泡放到最后了而已

把1和2综合起来看,当j=0时,把a数组10个元素中最大的泡放到最后,当j=1时,把a数组10个元素中第二大的元素放到倒数第二个位置,依次类推..直到第10大的元素,即最小的元素放到正数第一个位置,可以这样测试一下,会更加清晰,把第一个循环去掉, 内层循环改为:

for(i=0; i< 10; i++) 相当于仅执行上述j=0的一次内层循环, 这个循环的作用是把最大的元素放到最后。

 这是我把外层循环注释掉之后的结果,只是把最大的“泡”放到了最后,其他位置没有更改。

作业1 找出数组中的最大值

#include <stdio.h>

double swap(double arr_01[],int n);

int main()
{
	double i;
	double arr[5]={1,2,6,4,4.5};	
	i=swap(arr,5);
	printf("数组中最大值元素为:%f",i);
	
	return 0;	
} 

double swap(double arr_01[],int n)
{
	double max=0;
	int i;
	for(i=0;i<n;i++)
	{
		if(max<arr_01[i])
			max=arr_01[i];
	}
	return max;
}

 本题要点就在于:

    if(max<arr_01[i])
            max=arr_01[i];

理解这两小段代码,问题自然迎刃而解啦。

 作业2 输出数组中最大值与最小值的差

#include <stdio.h>

double swap(double arr_01[],int n);

int main()
{
	double i;
	double arr[5]={1,2,7.5,4,4.5};	
	i=swap(arr,5);
	printf("%f",i);
	
	return 0;	
} 

double swap(double arr_01[],int n)
{
	double min=1000,max=0,sum=0;
	int i;
	for(i=0;i<n;i++)
	{
		if(max<arr_01[i])
			max=arr_01[i];
		if(min>arr_01[i])
			min=arr_01[i];
	}
	sum=max-min;
	
	return sum;
}

本题要点和上一题极其相似,深刻理解两个if的判断条件,问题也就迎刃而解啦

    if(max<arr_01[i])
            max=arr_01[i];
        if(min>arr_01[i])
            min=arr_01[i];

其中有一点需要注意,min的初始值不能为0,因为如果为0的话,如果数组中没有负数的话,那么min的值会始终等于0, 就失去了寻找数组中的最小值。如果数组中有负数的话,min初始值为0也不会有影响。总结一点:min的初始值需要比数组中的最小值要大,即可。

作业3  冒泡排序优化,提示,如果发现某一轮不需要进行任何交换,则可以提前终止循环。

#include <stdio.h>
void swap(int arr_01[],int i);

int main()
{
	int i,arr[5]={5,2,100,54,150};
	swap(arr,5);
	for(i=0;i<5;i++)
	{
		printf("交换后第%d个元素的值arr[%d]=arr[%d]\n",i,i,arr[i]);
	}
	
	return 0;
}

void swap(int arr_01[],int n)
{
	int i,j,temp;
	for(i=0;i<n-1;i++)
	{
		for(j=0;j<n-1;j++) 
			{
				if(arr_01[j]>arr_01[j+1])
				{
					temp=arr_01[j];
					arr_01[j]=arr_01[j+1];
					arr_01[j+1]=temp;
				}	
				else if(arr_01[j]<arr_01[j+1]||(arr_01[j]=arr_01[j+1]))
					continue;	
			}
	}
}

运行结果:

作业4 输入10个数到数组t中,再输入x,如果有与x相等的数组元素,输出该数组元素的下标;否则,输出-1。

#include <stdio.h> 

int main()
{
	int i,x,t[4]={0};
	for(i=0;i<4;i++) 
	{
		printf("请输入数组t中第%d个元素的值(以回车结束):t[%d]=\n",i,i);
		scanf("%d",&t[i]);
	}
	for(i=0;i<4;i++) 
	{
		printf("数组t中第%d个元素的值:t[%d]=%d\n",i,i,t[i]);
	}
	printf("请输入x的值:");
	scanf("%d",&x);
	for(i=0;i<4;i++)
	{
		if(x==t[i])
			printf("%d\n",i);
		else
			printf("-1\n");
	}
	
	return 0;
}

运行结果:

作业5 产生一个由10个元素组成的一维数组,并输出(由随机函数产生1-99),然后进行升序排序。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void swap(int arr_01[],int n);
void fuzhi(int arr_03[],int n);

int main()
{
	int i;
	int arr[10]={0};
	fuzhi(arr,10);
	for(i=0;i<10;i++)
	{
		printf("排序前(随机产生):arr[%d]=%d \n",i,arr[i]);
	}
	swap(arr,10);
	printf("\n");
	for(i=0;i<10;i++)
	{
		printf("排序后(升序排列):arr[%d]=%d \n",i,arr[i]);
	}
	return 0;
}
void fuzhi(int arr_03[],int n)
{
	int i;
	srand(time(0));
	for(i=0;i<n;i++)
	{
		arr_03[i]=rand()%99+1;
	}
}
	
void swap(int arr_01[],int n)
{
	int i,j,temp;
	for(i=0;i<n-1;i++)//比较的轮数 
	{
		for(j=0;j<n-1;j++)//每进行一轮比较,前一个小的元素和后一个较大的元素交换一下位置 
		{
			if(arr_01[j]>arr_01[j+1])
			{
				temp=arr_01[j];
				arr_01[j]=arr_01[j+1];
				arr_01[j+1]=temp;
			}	
		}	 
	}
}	

运行结果:

 今日总结完毕,over,碎觉!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不掉头发的程序猿_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值