设X[0:n-1]和Y[0:n-1]为2 个数组,每个数组中含有n 个已排好序的数。试设计一个O(log n)时间的算法,找出X和Y 的2n个数的中位数。
例如,当n=7,X=[1,3,6,7,8,9,10];Y=[2,4,5,11,12,13,14]时,X 和Y的中位数是7。
输入文件示例 输出文件示例
input.txt output.txt
7 7
1 3 6 7 8 9 10
2 4 5 11 12 13 14
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
void mid (int *a,int *b ,int aleft,int bleft,int n);
void getmid (int *a,int *b,int aleft,int bleft);
int main()
{
int n,i;
FILE *fp;
if((fp=fopen("input.txt","rb"))==NULL)
{
printf("cant open this file");
exit(0);
}
fscanf(fp,"%d",&n);
int *a = (int*)malloc(sizeof(int)* n);
int *b = (int*)malloc(sizeof(int)* n);
for(i=0;i<n;i++)
fscanf(fp,"%d",&a[i]);
for(i=0;i<n;i++)
fscanf(fp,"%d",&b[i]);
mid(a,b,0,0,n);
fclose(fp);
return 0;
}
void mid (int *a,int *b ,int aleft,int bleft,int n){
int mida,midb,m;
if(n==2) getmid(a,b,aleft,bleft);
//这里会出错
if(n%2==0){
m=n/2;
mida=(a[aleft+m]+a[aleft+m-1])/2;
midb=(b[0+m]+b[0+m-1])/2;
}else{
m=(n-1)/2;
mida=a[aleft];
midb=b[bleft];
}
if(mida==midb) printf("%d\n",mida);
else if(mida>midb) {
if(n%2==0) mid(a,b,aleft,m,m);
else mid(a,b,aleft,m,m+1);
}
else {
if(n%2==0) mid(a,b,m,bleft,m);
else mid(a,b,m,bleft,m+1);
}
printf("%d %d\n",mida,midb);
}
void getmid (int *a,int *b,int aleft,int bleft){
int mid;
if(a[aleft]>b[bleft]) {
if(a[aleft+1]<b[bleft+1]) mid=a[aleft]+a[aleft+1];
else mid=b[bleft+1]+a[aleft] ;}
else if(a[aleft]<b[bleft]) {
if(a[aleft+1]>b[bleft+1]) mid=b[bleft+1]+b[bleft];
else mid=b[bleft]+a[aleft+1];
}
printf("%d\n",mid);
}
请问大神程序问题出在哪里。谢谢啦!