| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1027 人关注过本帖
标题:[讨论][原创]折半查找这样为什么不行?
只看楼主 加入收藏
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
 问题点数:0 回复次数:9 
[讨论][原创]折半查找这样为什么不行?
这是我写的 对半查找..请问可以吗?
# include <stdio.h>
int find(int k,int a[15],int x,int y)
{int i,z,n=0;
for(;x<=y;x++)
n=n+1;//求X到Y之间的个数//
z=y;
for(i=1;i<=n/2;i++)
z=z-1;//取Z为其中间值//
if(i==1) {printf("There is nothing"); return;}
if(k==a[z]) {printf("%d",z); return;}
if(k>a[z]) {y=z; find(k,a[15],x,y);}
if(k<a[z]) {x=z; find(k,a[15],x,y);}
}

main()
{int a[15];
int i,k;
for(i=0;i<15;i++)
scanf("%d",&a[i]);

scanf("%d",&k);
find(k,a[15],0,14);
getch();
}

是从大到小输入15个数...找个K的位置!

我用递归做的.可是....运行不了..理论上应该没有问题..请问哪里的毛病
搜索更多相关主题的帖子: 折半 
2006-03-17 07:00
chenfeiam
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-2-16
收藏
得分:0 

我也遇到过这样的情况,后来我采用的方式是不用函数的嵌套,我觉得是INT型函数的嵌套造成的,
#include<stdio.h>

int bifind(int a[],int bi,int from,int to)
{
int mid;
while(to>from+1)
{
mid=(from+to)/2;
if(a[mid]==bi)
return(mid);
if(a[mid]>bi)
to=mid;
if(a[mid]<bi)
from=mid;
};
if(to==from+1)
{
if(a[to]==bi) return(to);
if(a[from]==bi) return(from);
else return (-1);
}
}
main()
{
int a[]={1,3,5,7,9,11,14,16,18,19};
int b[]={5,12,26,3};
int i,j;
for(i=0;i<10;i++)
printf("%3d",a[i]);
printf("\n");
for(i=0;i<4;i++)
{j=bifind(a,b[i],0,9);
if(j>=0)
printf("%3d is at %2d\n",b[i],j+1);
else
printf("can't find %3d \n",b[i]);
}
}
而且在C-FREE中 INT 型函数的RETURN 后不可以为空。


2006-03-17 12:41
zhangjuan
Rank: 1
等 级:新手上路
帖 子:992
专家分:0
注 册:2006-1-19
收藏
得分:0 
以下是引用SunShining在2006-3-17 7:00:00的发言:
这是我写的 对半查找..请问可以吗?
# include <stdio.h>
int find(int k,int a[15],int x,int y)
{int i,z,n=0;
for(;x<=y;x++)
n=n+1;//求X到Y之间的个数//
z=y;
for(i=1;i<=n/2;i++)
z=z-1;//取Z为其中间值//
if(i==1) {printf("There is nothing"); return;}
if(k==a[z]) {printf("%d",z); return;}
if(k>a[z]) {y=z; find(k,a[15],x,y);}
if(k<a[z]) {x=z; find(k,a[15],x,y);}
}

main()
{int a[15];
int i,k;
for(i=0;i<15;i++)
scanf("%d",&a[i]);

scanf("%d",&k);
find(k,a[15],0,14);
getch();
}

是从大到小输入15个数...找个K的位置!

我用递归做的.可是....运行不了..理论上应该没有问题..请问哪里的毛病

总的来说你的程序很乱,在实参中的k是用来干什么的,而且形参里的数组只能得到首地址,无法实现循环,还有很多,不过你最好把你的思中程贴出来,我看我能不能帮你整理。


2006-03-17 12:48
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
以下是引用SunShining在2006-3-17 7:00:00的发言:
这是我写的 对半查找..请问可以吗?
# include <stdio.h>
int find(int k,int a[15],int x,int y)
{int i,z,n=0;
for(;x<=y;x++)
n=n+1;//求X到Y之间的个数//
z=y;
for(i=1;i<=n/2;i++)
z=z-1;//取Z为其中间值//
if(i==1) {printf("There is nothing"); return;}//这里是当I==1时.数组里没有要查找的数//
if(k==a[z]) {printf("%d",z); return;}//A[Z]为数组中间的值.当K==A[Z]那么就打印了//
if(k>a[z]) {y=z; find(k,a,x,y);}//大不了把下标去掉.可结果还是一样的//
if(k<a[z]) {x=z; find(k,a,x,y);}
}

main()
{int a[15];
int i,k;
for(i=0;i<15;i++)
scanf("%d",&a[i]);

scanf("%d",&k);//k 不就是在数组A里面要查找的 那个数吗.这个不知道吗//
find(k,a[15],0,14);
getch();
}

是从大到小输入15个数...找个K的位置!

我用递归做的.可是....运行不了..理论上应该没有问题..请问哪里的毛病

我感觉我写的很明白了.不算很乱了..很容易理解的啊..理论上也没问题.

应该不是函数的问题..我到觉着有点象IF那里的问题.


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-03-17 15:58
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
我的理论也很简单..

一个15的数组 那么下标就应该是 0到14

用X代表 0 Y代表 14 那么就是数组的头和尾

然后计算其X到Y的长度..为N...

再用Z=Y..那么Z就在这个数组的尾部了.

然后 FOR(I=1,I<=N/2,I++)
Z=Z-1;
这样..A[Z]就是 A[X]到A[Y]的中间值

如果..K大于A[Z]..那么 把Z给Y...这样.又形成一个理论上的新数组.然后调用

如果..K小于A[Z]..那么就把Z给X.这样.X到Y就表示后半部分的数组了.重复调用 直到K=A[Z],或者.I=1..结素!

理论没问题的吧

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-03-17 16:11
cordier
Rank: 2
等 级:论坛游民
威 望:1
帖 子:449
专家分:14
注 册:2006-2-9
收藏
得分:0 

我怎么感觉有一点小问题,但一时又说不上来


2006-03-17 17:27
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-03-17 17:50
haishanglang
Rank: 1
等 级:新手上路
帖 子:378
专家分:0
注 册:2006-3-2
收藏
得分:0 

# include <stdio.h>
void find(int k,int a[15],int x,int y)
{int i=0,z,n=0;
for(;x<=y;x++)
n=n+1;//求X到Y之间的个数//
z=y;
for(i=1;i<=n/2;i++)
z=z-1;//取Z为其中间值//
if(i==1) {printf("There is nothing");exit();}
if(k==a[z])
{
printf("The number %d has been found,\n",a[z]);
printf("it is the %d number.\n",z+1);
}
if(k>a[z])
{ y=z;
x=0; //注意前面执行过for(;x<=y;x++),故x已经变为15,需重新设为0
find(k,a,x,y);
}
if(k<a[z])
{ x=z;

find(k,a,x,y);
}

}

main()
{int a[15];
int i,k;
printf("Input the numbers from larger to smaller:\n");
for(i=0;i<15;i++)
scanf("%d",&a[i]);
printf("Input the number you want to seek:\n");
scanf("%d",&k);
find(k,a,0,14);

}

楼主想通过递归调用函数的想法是可行的,


2006-03-17 19:00
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 

晕..谢谢了..原来是这样..嘿嘿.马虎了!

不过.我想

if(k>a[z])
{ y=z;
x=0; //注意前面执行过for(;x<=y;x++),故x已经变为15,需重新设为0
find(k,a,x,y);
} 这步调用不能X=0..如果调用过下面的.再调用上面的就错了

所以.我再添加个变量M就可以了..总之 谢谢你了!!


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-03-18 13:52
haishanglang
Rank: 1
等 级:新手上路
帖 子:378
专家分:0
注 册:2006-3-2
收藏
得分:0 
恩,有道理,不好意思,见笑了

2006-03-18 14:18
快速回复:[讨论][原创]折半查找这样为什么不行?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028967 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved