求两个数组的中位数,不合并数组

数组a,b的中位数是a[m1],b[m2],
a[m1]=b[m2],则a[m1],b[m2]即为中位数
a[m1]<b[m2],舍弃a的左边,b的右边
a[m1]>b[m2],舍弃a的右边,b的左边
#include <stdio.h>
#include <stdlib.h>

int SearchMid(int a[], int b[], int n);

int  main()
{
	int n=5;
	int a[5]={1,2,7,9,10}, b[5]={6,7,8,9,10};
	int m1,m2;
	m1=m2=n/2;
	//a,b数组中位数a[m1],b[m1]相同,则中位数一定为 a[m1]或b[m1]
	if (a[m1] == b[m2])
		printf("中位数:%d",a[m1]);
	else  					//不同的话则调用SearchMid函数 
		SearchMid(a, b, 5);
}

int SearchMid(int a[], int b[], int n)
{
	int	start1 = 0, end1 = n-1, m1;
	int	start2 = 0, end2 = n-1, m2;
//首位不相同则说明数组的中位数还未找到还没有 
	while (start1 != end1 || start2 != end2) {
		m1 = (start1 + end1) / 2;
		m2 = (start2 + end2) / 2;
//	数组a的中位数小于数组b的中位数,舍去a的较小的一边,b较大的一边,舍去的数量要一样 
//  舍去的a左边,b的右边 
		if (a[m1] < b[m2]) {
			if ((start1+end1) % 2 == 0) {			//数组中数量为奇数 ,数组下标从零开始 
				start1 = m1;
				end2 = m2;
			} 
			else {						//数组中数量为偶数 ,数组下标从零开始 
									//中位数会偏左所以需要给a数组的舍去的左边加一位  
				start1 = m1 + 1;		<span style="white-space:pre">	</span>//使两边舍去的数量一样
				end2 = m2;
			}
		} 
//	数组a的中位数大于数组b的中位数,舍去a的较大的一边,b较小的一边
//	舍去a的右边,b的左边 
		else {										
			if ((start1+end1) % 2 == 0) {				
				end1 = m1;
				start2 = m2;
			} 
			else {
				end1 = m1;
				start2 = m2 + 1;
			}
		}
	}
	printf("中位数:%d %d\n",a[start1],b[start2]);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值