设X[0:n-1]和Y[0:n-1]为2 个数组,每个数组中含有n 个已排好序的数。试设计一个O(log n)时间的算法,找出X和Y 的2n个数的中位数。

q6436175 2015-04-12 11:50:18
例如,当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);
}


请问大神程序问题出在哪里。谢谢啦!
...全文
1793 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
苏叔叔 2015-04-13
  • 打赏
  • 举报
回复
来一个O(n)的:

int main(void)
{
	int x[] = { 2, 4, 5, 11, 12, 13, 14 };
	int y[] = { 1, 3, 6, 7, 8, 9, 10 };
	int a1, a2, n1, n2, n;
	n = n1 = n2 = 0;
	while (n < 7)
	{
		a1 = x[n1] <= y[n2] ? x[n1++] : y[n2++];
		n++;
	}
	a2 = x[n1] <= y[n2] ? x[n1++] : y[n2++];
	printf("%lg\n", (double)(a1 + a2) / 2);

	return 0;
}
//7.5
苏叔叔 2015-04-13
  • 打赏
  • 举报
回复
1 2 3 4 5 6 7 8 9 10 11 12 13 14 这14个数的中位数应该是(7+8)/2=7.5啊

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧