问题描述
设X[ 0 : n - 1]和Y[ 0 : n – 1 ]为两个数组,每个数组中含有n个已排好序的数。找出X和Y的2n个数的中位数。
编程任务
利用分治策略试设计一个O (log n)时间的算法求出这2n个数的中位数。
数据输入
由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n<=200),表示每个数组有n个数。接下来的两行分别是X,Y数组的元素。
实现提示
比较两个序列的中位数大小,如果两个数相等,则该数为整个2n个数据的中位数,否则通过比较,分别减少两个序列的查找范围,确定查找的起止位置,继续查找。
结果输入输出
输入文件
输出文件
①这道题下午想了有挺久,首先很容易想到如果两个数组中间两个数相等,那中位数就是中间那个数。这个可以举例,如果n是奇数,如果n是偶数,发现都是满足要求的。但是如果直接证的话,也得分如果n是奇数,那么a数组中中小于xa的有(n-1)/2个,大于xa的也有(n-1)/2个,同理b数组也是,所以对于xa或者是yb则整个2n数组中小于和大于他们的数分别为(n-1)个,取这两个数的平均值(xa+yb)/2=xa=yb即为中位数。n是偶数,也差不多这么证。
②但如果两个数组中间两个数不等的话,如果a数组中位数小于b数组中位数的话,那两个数组合并之后的中位数一定在a的右边或者b的左边我感觉这其实细细品一下就出来了,然后分奇偶再讨论一下,或者举出实例,在n是奇数或是偶数的时候该怎么分。感觉举实例是最容易理解的
③如果a数组中位数大于b数组中位数的话,就跟第二种情况相反了~
#include <stdio.h>
#include <stdlib.h>
int a[200],b[200];
double FindOneMiddle(int a[],int left,int right)
{
double mid;
int n=right-left+1;
if(n%2==0)//有偶数个元素
mid=(a[n/2]+a[n/2-1])*1.0/2;
//有奇数个元素
else
mid=a[n/2]*1.0;
return mid;
}
int max(int a,int b