算法设计实验--中位数问题

中位数问题

两个相同大小的有序数组,求此2n个数的中位数。
大体思路
分别求出两数组中的中位数并进行比较
1,若相等,则即为所求;
2,如果x数组中的中位数大于y数组中的中位数,则进一步在x数组的后半段和y数组的前半段中寻找中位数;
3,同理,如果小于,则在x数组的前半段,y数组的后半段中寻找。
递归终止条件
1,两段中的中位数相同;
2,两个数组中均只剩下两个元素【不可能存在数组中剩下的元素数量不同的情况,每次都是减去一半】
特殊情况
输入的数组仅一个元素

#include<iostream>
#include<fstream>
using namespace std;

int getmid(int *a, int la, int ra)
{
	int ma = 0;
	int mid = 0;
	if ((ra - la) % 2 == 0)
	{
		ma = (ra + la) / 2;
		mid = a[ma];
	}
	else
	{
		ma = (ra + la +1) / 2;
		mid = (a[ma] + a[ma - 1]) / 2;
	}
	return mid;
}
int allmids(int *x, int *y, int lx, int ly, int rx, int ry)
{
	int mid = 0;
	//最后两个数组里均只剩下一个元素
	if ((lx == rx) && (ly == ry))
	{
		mid = (x[lx] + y[ly]) / 2;
		return mid;
	}
    //两个数组里均剩下两个元素
    //比较的时候先剔除一个最小的,然后再进行寻找
	if (((rx - lx) == 1) && ((ry - ly) == 1))
	{
		if (x[lx] > y[ly])
		{
			if (x[lx] > y[ry])
			{
				mid = (x[lx] + y[ry]) / 2;
				return mid;
			}
			if (x[rx] < y[ry])
			{
				return mid = (x[rx] + x[lx]) / 2;
			}
		}
		else
		{
			if (x[lx] == y[ly])
				return mid = x[lx];
			if (x[lx] < y[ly])
			{
				if (x[rx] > y[ry])
					return mid = (y[ly] + y[ry]) / 2;
				if (x[rx] < y[ry])
					return mid = (y[ly] + x[rx]) / 2;
			}
		}
		
	}
	int mx = (lx + rx + 1) / 2;
	int my = (ly + ry + 1) / 2;
	int midx = getmid(x, lx, rx);
	int midy = getmid(y, ly, ry);
	
	if (midx == midy)
		return midx;
	if (midx > midy)
	{
		rx = mx; ly = my;
		return allmids(x, y, lx, ly, rx, ry);
	}
	else
	{
		ry = my; lx = mx;
		return allmids(x, y, lx, ly, rx, ry);
	}
}
int main()
{
	int n; 
	ifstream f1("C:\\Data\\1.txt");
	ofstream f2("C:\\Data\\2.txt");
	if ((!f1) || (!f2))
	{
		cout << "文件错误!" << endl; return 0;
	}
	f1 >> n;
	int  mid = 0;
	int *x = new int[n];
	int *y = new int[n];
	for (int a = 0; a < n; a++)
	{
		f1 >> x[a];
	}
	for (int b = 0; b < n; b++)
	{
	    f1 >> y[b];
	}
	mid = allmids(x, y, 0, 0, n - 1, n - 1);
	cout << mid<< endl;
	f2 << mid;
	f1.close();
	f2.close();
	return 0;
}
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值