求两等长升序序列的中位数

题目:一个升序序列的中间位置的元素称为中位数,两个序列的中位数则是这两个序列升序排好序后的中间的数为中位数,现有两个等长的生序序列
    A、B,找出它们的中位数。
分析:
        我们可以先将这两个序列合并成一个升序序列,然后即可求出中位数,但是这样时间复杂度为O(n),空间复杂度也为O(n);
        我们也可以采用归并排序的想法,先求出两个序列的总元素的个数,因为他们等长,只需求出一个序列的长度,中间位置即为len,
        之后我们开始依次比较,并进行计数count,当count=len时,该元素即为中位数,这样时间复杂度为O(n),空间复杂度为O(1)

 

代码如下:

#include <stdio.h>
int findMidNum(int *l1,int *l2,int len) {
	int count=0,middle;
	for (int i = 0, j = 0; *(l1 + i) && *(l2 + j);) {//依次比较,较小者出列
		if (++count == len) {//判断是否到达中位数的位置
			middle = *(l1 + i) < *(l2 + j)? *(l1 + i): *(l2 + j);//取出中位数
			break;
		}
		else {
			*(l1 + i) < *(l2 + j) ? i++ : j++;//没有到,继续归并
		}
		
	}
	return middle;
}
int main() {
	int l1[] = {1,3,4,7,9};
	int l2[] = {2,4,6,8,10};
	int len = sizeof(l1) / sizeof(int);
	int middle;
	middle = findMidNum(l1,l2,len);
	printf("中位数是:%d ",middle);
	return 0;
}

风萧萧兮易水寒,壮士一去兮不复还!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

北街学长

你的鼓励使我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值