中位数问题
两个相同大小的有序数组,求此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;
}