c语言折半查找法不知错在哪里,求高手帮助,谢谢

#include<stdio.h>
int x=1,b;
void main()
{
int a[15]={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
int bysearch(int a[15]);
scanf("%d",&b);
if(x=2) printf("%d",bysearch(a)+1);
else printf("木有");
}
int bysearch(int a[15])
{
int m=0,n=14,i;
for(;(n-m)!=1;)
i=(m+n)/2;
{
if(a[i]!=b)
{
if(a[i]>b) m=(m+n)/2;
else n=(m+n)/2;
}
else x=x+1;
}
return(i);
}

不客气说,你这个代码写的错误的地方实在是太多了,而且逻辑也不是很清楚,包括传递参数的方式等都不太好,还有既然是一个独立的函数就尽量不要使用全局变量,不过还是在你的基础上给你改了一下,以便你能对比的看一下,代码如下:
#include<stdio.h>
int x=1,b;
void main()
{
int a[15]={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
scanf("%d",&b);
int bysearch(int a[15]);
int result=bysearch(a)+1;//应该先调用函数,否则x无法在你的下一步判断前进行更新
if(x==2) //此处应该使用==
printf("%d",result);
else printf("木有");

}
int bysearch(int a[15])
{
int m=0,n=14,i;
for(;n-m>1;) //n-m!=1,那么n-m==1的情况呢,你的代码中没有进行处理
{
i=(m+n)/2;//这一句应该放在循环中
if(a[i]!=b)
{
if(a[i]>b) m=i;//既然已经有了i的赋值,那就不要用(m+n)/2
else n=i;
}
else
{
x=x+1;
break;//既然找到了,就该跳出循环了,直接返回了,否则会多余循环操作
}
if (n-m==1)//-处理差为1的情况
{
if (a[n]==b)
{
x=x+1;
return n;
}
else
{
if (a[m]==b)
{
x=x+1;
return m;
}
else
return -1;
}
}
}
return(i);
}
其实折半查找用递归操作最好了,代码简洁一目了然,还有就是判断好边界,你写的这个折半查找函数只能用于一处,不具备普遍价值,最好的这样的形式
int biSearch(int array[],int m,int n,int value);
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-13
仔细看下你的{}
用的不对
for(;(n-m)!=1;) //.............怪异的FOR
i=(m+n)/2; // 这个语句是用来执行FOR的 那下行的那个{ 是谁的??..........
{ //...........问题就出在这三个地方你自己看看吧
if(a[i]!=b)
{
if(a[i]>b) m=(m+n)/2;
else n=(m+n)/2;
}
第2个回答  2011-04-12
你的函数传递参数有误,定义一个a[15]数组,最大下标是14!
相似回答