英国爱他美有水解奶粉:我的分治法求最大值与最小值错在哪(C语言)?

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/07 05:12:51
//找最大值与最小值(分治法)
//在含有n个不同元素的集合中同时找出它的最大值和最小值
int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
void maxmin(int i,int j,int *fmax,int *fmin)
{
int mid,hmax,hmin,gmax,gmin;
if(i==j) {*fmax=a[i]; *fmin=a[i];}
if(i==j-1)
if(a[i]>a[j]) {*fmax=a[i]; *fmin=a[j];}
else {*fmax=a[j]; *fmin=a[i];}
else
{
mid=(i+j)/2;
maxmin(i,mid,&gmax,&gmin);
maxmin(mid+1,j,&hmax,&hmin);
*fmax=gmax>hmax? gmax:hmax;
*fmin=gmin<hmin? gmin:hmin;
}
}

void main()
{
int max,min;
maxmin(0,2,&max,&min);
printf("max=%d,min=%d",max,min);
}

请高手帮忙指导提醒一下,谢谢!

----------------------
好象你在找到最大和最小值后忘了退出了.
----------------------

#include <stdio.h>

int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
/*调试用的变量,防止进入死循环*/
static long int tmp=1;

void maxmin(int i,int j,int *fmax,int *fmin)
{
int mid,hmax,hmin,gmax,gmin;

/*输出调试信息*/
printf("enter the maxmin()! [%d]tmes!\n",tmp);
tmp++;
/*如果调用此函数超过1000次则退出程序*/
if(tmp>=1000){
printf("The program mabye dead!\n");
exit(0);
}

if(i==j){
printf("the i=j\n");
*fmax=a[i]; *fmin=a[i];
return;/*此语句可以在找到最大值和最小值时退出继续运行*/
}
if(i==j-1){
printf("the i=j-1\n");
if(a[i]>a[j]){
*fmax=a[i]; *fmin=a[j];
return;/*此语句可以在找到最大值和最小值时退出继续运行*/
}else{
*fmax=a[j]; *fmin=a[i];
return;/*此语句可以在找到最大值和最小值时退出继续运行*/
}
}else{
printf("the i!=j and i!=j-1\n");
mid=(i+j)/2;
maxmin(i,mid,&gmax,&gmin);
maxmin(mid+1,j,&hmax,&hmin);
*fmax=gmax>hmax? gmax:hmax;
*fmin=gmin<hmin? gmin:hmin;
}
}

void main()
{
int max,min;
maxmin(0,19,&max,&min);
printf("max=%d,min=%d",max,min);
}


问题出在maxmin()函数上,一个很小的逻辑错误,我试着更正了以下,你看看:
void maxmin(int i,int j,int *fmax,int *fmin)
{
int mid,hmax,hmin,gmax,gmin;
if(i==j) {*fmax=a[i]; *fmin=a[i];}
else //这里
{
if(i==j-1)
if(a[i]>a[j]) {*fmax=a[i]; *fmin=a[j];}
else {*fmax=a[j]; *fmin=a[i];}
else
{
mid=(i+j)/2;
maxmin(i,mid,&gmax,&gmin);
maxmin(mid+1,j,&hmax,&hmin);
*fmax=gmax>hmax? gmax:hmax;
*fmin=gmin<hmin? gmin:hmin;
}
}
}