寻找两个正序数组的中位数(不考虑时间复杂度的情况)

大家好!我是一所民办二本计科专业的学生,目前大二,学了两个月c语言,前几天偶然在力扣上发现这个算法题,所以想和大家分享一下在写代码的时候可能碰到的一些bug,本来觉得发出来可能有些丢人,写的这么辣鸡,而且还没考虑时间复杂度的情况,大部分人来写都能写出来吧。虽然写这篇文章可能会受到一些人的谩骂,又或许根本不会有人关注,但我还是想把它给呈现出来给大家看,毕竟也是我自己的心血,但我同样希望它能帮助到跟我一样初入c语言,但是又只能靠自己学的小白。


代码如下
#include<stdio.h>
int N_element_1 = 0;     //声明全局变量
int N_element_2 = 0;
void string_compact(int arr1[], int n1, int arr2[], int n2)   //声明形参的数据类型,arr1[]和arr2[]作函数形参,传入的是数组首元素地址,本质上是指针。
{

	int* p1 = arr1, * p2 = arr2;   //*p1=arr1,表示指针变量p指向数组arr1,*p2同理。
	int n = 0;
	p1 = p1 + n1;       //指针从数组第一位指向最末位
	while (n < n2) {     //将数组2元素和数组1元素串联
		*p1 = *p2;       //*p1=*p2是指将p2此时指向的元素赋值给*p1指向的元素
		p1++;         //p1++是使指针从第0个元素指向下一个元素,直到不满足循环条件跳出循环。
		p2++;
		n++;
	}
}

int main()

{
	int num_1[100] = { 0 };
	int num_2[100] = { 0 };
	int tmp = 0;

	printf("请输入数组1的元素个数:\n");

	scanf_s("%d ", &N_element_1);
	for (int i = 0; i < N_element_1; i++) {
		scanf_s("%d", &num_1[i]);          //[i]是因为用for循环给数组每一个元素赋值
	}
	printf("请输入数组2的元素个数:\n");

	scanf_s("%d", &N_element_2);
	for (int i = 0; i < N_element_2; i++) {
		scanf_s("%d", &num_2[i]);
	}
	string_compact(num_1, N_element_1, num_2, N_element_2); //传入数组1、2和数组1、2的长度
	N_element_1 = N_element_1 + N_element_2;       //将数组串联后的长度赋值给数组1

	for (int i = 0; i < N_element_1 - 1; i++) {                   //c语言入门的冒泡排序(为了让串联数组变得有序,有实力的观众可以用希尔排序或者归并排序),双层for循环是先外层一次,内层全部循环。
		for (int j = 0; j < N_element_1 - 1 - i; j++) {          //不用与自己排序所以循环少一次

			if (num_1[j] > num_1[j + 1]) {
				tmp = num_1[j + 1];
				num_1[j + 1] = num_1[j];
				num_1[j] = tmp;
			}
		}

	}
	for (int i = 0; i < N_element_1; i++)
		printf(" %d ", num_1[i]);
	int x = N_element_1 / 2;

	if (N_element_1 % 2 == 0) {
		double middle = (num_1[x - 1] + num_1[x]) / 2.0;
		printf("该有序串联数组中位数是:%lf", middle);
	}
	else {
		double middle = num_1[x];
		printf("该有序串联数组中位数是:%lf", middle);
	}
	return 0;
}
代码运行如下

 还没有学到指针的朋友,可以用for循环实现数组的串联

#include<stdio.h>
int main()
{
	int num_1[100] = { 0 };
	int num_2[100] = { 0 };
	int num_res[100] = {0};
	int tmp = 0;
	int N_element_1, N_element_2 = 0;
	int length = 0;

	printf("请输入数组1的元素个数:\n");

	scanf_s("%d ", &N_element_1);
	for (int i = 0; i < N_element_1; i++) {
		scanf_s("%d", &num_1[i]);
	}
	printf("请输入数组2的元素个数:\n");

	scanf_s("%d", &N_element_2);
	for (int i = 0; i < N_element_2; i++) {
		scanf_s("%d", &num_2[i]);
	}
	length = N_element_1 + N_element_2;
	for (int i = 0, k=0; i < N_element_1; i++, k++) {
		num_res[k] = num_1[i];
	}
	for ( int k = N_element_1,j=0;j< N_element_2; j++,k++) {
		num_res[k] = num_2[j];
	}
	for (int k = 0; k < length; k++) {
		printf(" %d ", num_res[k]);
	}
	return 0;
}

 运行结果如下

以上就是该帖子的所有内容,内容均为原创。因为作者没什么实力,如果有错误,恳请大家指出。也欢迎大佬、小白来一起交流,谢谢!

目录

                                                     从零开始的c语言生活


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值