一个二分法查找要用到递归调用的问题

denghongli1 2005-10-31 09:19:50
#include<stdio.h>
#include<string.h>
main()
{
int k,m,a[10],i,j,t,e,f;
int search(int a[],int l,int h,int k);
clrscr();
printf("input 10 numbers :\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<=8;j++)
for(i=0;i<=10-j;i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("the sorted numbers :\n");
for(i=0;i<10;i++) printf(" %d",a[i]);
printf("\n");
scanf("%d",&k);
m=search( a,e,f,k);
printf("\n%d",m);
}
int search(int a[],int l,int h,int k)
{
int j;
l=0;
h=9;
while(l<=h)
{
j=(l+h)/2;
if(a[j]==k) return(a[j]);
if(a[j]>k) return search(a,l,h-1,k); /* h=j-1; */
else return search(a,l-1,h,k); /* l=j+1; */
}
return(-1);
}

...全文
346 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
langzi520 2005-11-02
  • 打赏
  • 举报
回复
学习
denghongli1 2005-11-01
  • 打赏
  • 举报
回复
不知道前面的那位用的是什么编译系统

我运行你的程序怎么还是有问题啊

我的QQ是:283884090

希望我们能成为朋友!

谢谢
denghongli1 2005-11-01
  • 打赏
  • 举报
回复
现在搞定了

呵呵

谢谢前面的那位了
#include<stdio.h>
#include<string.h>
main()
{
int k,m,a[10],i,j,t,e;
int search(int a[],int m,int k);
clrscr();
printf("input 10 numbers :\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<=8;j++)
for(i=0;i<=10-j;i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("the sorted numbers :\n");
for(i=0;i<10;i++) printf(" %d",a[i]);
printf("\n");
scanf("%d",&k);
e=search( a,m,k);
printf("\n%d",e);
}
int search(int a[],int m,int k)
{
int j;
while(1)
{
j=m/2;
if(a[j]==k) return(a[j]);
if(a[j]>k) return search(a,j-1,k); /* h=j-1; */
else return search(a,j+1,k); /* l=j+1; */
}
return(-1);
}

mrelay 2005-11-01
  • 打赏
  • 举报
回复
你的程序问题多了。我给改了一下。如下
#include<stdio.h>
#include<string.h>
void main()   //加了一个void
{
int k,m,a[10],i,j,t,e;
int search(int a[],int m,int k);
clrscr();
printf("input 10 numbers :\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<=9;j++)    // 改为9
for(i=0;i<=8-j;i++)  //改为8-i
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("the sorted numbers :\n");
for(i=0;i<10;i++) printf(" %d",a[i]);
printf("\n");
scanf("%d",&k);
m = 9;          //给m 附值  在你的代码中m 就没有给附过值
e=search( a,m,k);
printf("\n%d",e);
return ;           //加上return

}
int search(int a[],int m,int k)
{
int j;
while(1)
{
j=m/2;
if(a[j]==k) return(a[j]);
if(a[j]>k) return search(a,j-1,k); /* h=j-1; */
else return search(&a[j+1],m,k); /* l=j+1; */  //改为&a[j+1],m
}
return(-1);
}
fyps 2005-11-01
  • 打赏
  • 举报
回复
哈,抛个砖,大家再多考虑点
程序健壮性,如果获得数字时,输入比如a
希望大家可以想到相对简洁明了的方法
denghongli1 2005-11-01
  • 打赏
  • 举报
回复
不过我这个还是有点问题

就是在编译的时候出现一个警告

前面那个朋友说是没有初始化

但是,如果我一旦初始化就会运行不正常

就会自动结束运行

请大家帮忙修改一下
yanxiazhiqiu 2005-11-01
  • 打赏
  • 举报
回复
另外,你的查找方法要干嘛呀?

int BinarySearch(Type a[],const Type& x,int n)

{

int left=0;

int right=n-1;

while(left<=right){

int middle=(left+right)/2;

if (x==a[middle]) return middle;

if (x>a[middle]) left=middle+1;

else right=middle-1;

}

return -1;

yanxiazhiqiu 2005-11-01
  • 打赏
  • 举报
回复
你的排序有问题:
for(j=0;j<=8;j++)
for(i=0;i<=10-j;i++)

改成:
for(j=0;j<=9;j++)
for(i=0;i<=8-j;i++)
或:
for(j=0;j<10;j++)
for(i=0;i<9-j;i++)
denghongli1 2005-11-01
  • 打赏
  • 举报
回复


对了前面有朋友提出程序的健壮性

是的

的确,我的那个程序没有考虑到那个问题

我是真的没有想到那个问题

要是谁想到了的话请回帖在这里

我们大家都能看得见

那我现在就不结帖了

等等看

看有没有朋友把这个问题解决

谢谢了!
denghongli1 2005-11-01
  • 打赏
  • 举报
回复
现在终于没有任何毛病了


呵呵

谢谢前面的各位了

刚才在前面的那位朋友提醒得好,非常感谢!

我的那个m是确实没有初始化,还有就是最下面的那个地方没有把a改成&a[j+1]

其余就没有什么毛病了,现在已经经过测试了没有问题了

现在把这个修改好了的程序也帖出来希望有遇到跟我类似的问题的朋友能够少走弯路!

呵呵

#include<stdio.h>
#include<string.h>
main()
{
int k,m=10,a[10],i,j,t,e;
int search(int a[],int m,int k);
clrscr();
printf("input 10 numbers :\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<=8;j++)
for(i=0;i<=10-j;i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("the sorted numbers :\n");
for(i=0;i<10;i++) printf(" %d",a[i]);
printf("\n");
scanf("%d",&k);
m=9; /* 就是这里开始没有把m初始化 */
e=search( a,m,k);
printf("\n%d",e);
/* return; */ /* 这里要不要return 都无所谓 */
}
int search(int a[],int m,int k)
{
int j;
while(1)
{
j=m/2;
if(a[j]==k) return(a[j]);
if(a[j]>k) return search(a,j-1,k); /* h=j-1; */
else return search(&a[j+1],m,k); /* l=j+1; */ /* 这里要注意数组的变化 */
}
return(-1);
}
0黄瓜0 2005-10-31
  • 打赏
  • 举报
回复


//楼主的程序有很多问题
//这是依你的思路重写的
#include<stdio.h>
#include<string.h>
int RecBinarySearch(int a[],int first,int last,int item)
{
if(first>last)//当要查找的值不在数组a中,递归调用将会使first>last
return 0xFFFFFFFF;
int pos=0;

pos=(first+last)/2;
if(item<a[pos])
RecBinarySearch(a,first,pos-1,item);
else if(item>a[pos])
RecBinarySearch(a,pos+1,last,item);
else
return a[pos];

}

void sort(int a[],int n)
{
int temp;
for(int i=0;i<n-1;i++)
for(int ii=i+1;ii<n;ii++)
if(a[i]>a[ii])
{
temp=a[i];
a[i]=a[ii];
a[ii]=temp;
}
}
void main()
{
int a[10];
printf("input 10 numbers :\n");
for(int i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
sort(a,10);
printf("the sorted numbers :\n");
for(i=0;i<10;i++) printf(" %d",a[i]);
printf("\n输入要查找的值");
int k,m;
scanf("%d",&k);
m=RecBinarySearch(a,0,9,k);
if(m==0xFFFFFFFF)
printf("你查找的数不在数组中\n");
else
printf("你查找的数%d已找到\n",m);
}
denghongli1 2005-10-31
  • 打赏
  • 举报
回复
怎么初始化?

这里应该不要初始化吧
llf_hust 2005-10-31
  • 打赏
  • 举报
回复
m=search( a,e,f,k);//e,f的值没有初始化
printf("\n%d",m);
denghongli1 2005-10-31
  • 打赏
  • 举报
回复
这个题目的主要问题是函数调用的时候老是出现警告!

69,379

社区成员

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

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