| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1027 人关注过本帖
标题:[讨论][原创]折半查找这样为什么不行?
取消只看楼主 加入收藏
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
 问题点数:0 回复次数:4 
[讨论][原创]折半查找这样为什么不行?
这是我写的 对半查找..请问可以吗?
# 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
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
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
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
快速回复:[讨论][原创]折半查找这样为什么不行?
数据加载中...
 
   



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

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