折半查找法

#defineN3#include"stdio.h"#include"conio.h"main(){inttop=N,lim=0,i,mid,a[N],n;for(i=0... #define N 3
#include "stdio.h"
#include "conio.h"

main()
{
int top=N,lim=0,i,mid,a[N],n;
for(i=0;i<N;i++)
a[i]=i;
scanf("%d",&n);
while(lim<top){
mid=1/2*(lim+top);
if(n>a[mid])
lim=a[mid]+1;
if(n<a[mid])
top=a[mid];
if(n=a[mid])
{printf("match item is %d",a[mid]);getch();exit(1);} }
printf("No match item.\n");
getch();
}
请问这个错在哪?
请将详细点,我是初学。谢谢
展开
 我来答
创作者NJILzEiRMd
2020-04-15 · TA获得超过3900个赞
知道大有可为答主
回答量:3262
采纳率:25%
帮助的人:151万
展开全部
折半查找法是效率较高的一种查找方法,假设有已经按照从小到大的顺序排列好的五个整数a0~a4,要查找的数是X,其基本思想是:
设查找数据的范围下限为l=0,上限为h=4,求中点m=(l+h)/2,用X与中点元素am比较,若X等于am,即找到,停止查找。
否则,若X大于am,替换下限l=m+1,到下半段继续查找。
若X小于am,换上限h=m-1,到上半段继续查找,如此重复前面的过程直到找到或者l>h为止。
如果l>h,说明没有此数,打印找不到信息,程序结束。
该方法是查找的范围不断缩小一半,所以查找效率较高。
扩展资料
折半查找法优缺点
Bentley在自己的著作《Writing
Correct
Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。
问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的。
折半查找法的优点是比较次数少,查找速度快,平均性能好。
其缺点是要求待查表为有序表,且插入删除困难,因此折半查找方法适用于不经常变动而查找频繁的有序列表。
参考资料来源:搜狗百科-折半查找法
创作者TpuuAeDxHT
2019-02-15 · TA获得超过3.7万个赞
知道大有可为答主
回答量:1.2万
采纳率:27%
帮助的人:1187万
展开全部
这是从你的代码中改过来的
你的问题就是1/2那,可以改为
(float)1/2*(lim+top);也可以以下代码是重你那改正并经过优化
#define
N
3
#include
"stdio.h"
#include
"conio.h"
void
main()
{
int
top=N,lim=0,i,mid,a[N],n;
for(i=0;i<N;i++)
a[i]=i;
//数组初开始化
scanf("%d",&n);
while(lim!=top)
//头尾相同时,查找失败
{
mid=(int)(lim+top)/2;
//获取数组中间索引
if
(n>a[mid])
lim=mid+1;
else
{
if(n<a[mid])
top=mid;
else
{
printf("match
item
is
a[%d]",mid);
getch();
return;
}
}
}
printf("No
match
item.\n");
getch();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
RexGene
推荐于2017-12-16
知道答主
回答量:16
采纳率:0%
帮助的人:22.8万
展开全部
这是从你的代码中改过来的
你的问题就是1/2那,可以改为
(float)1/2*(lim+top);也可以以下代码是重你那改正并经过优化
#define N 3
#include "stdio.h"
#include "conio.h"

void main()
{
int top=N,lim=0,i,mid,a[N],n;
for(i=0;i<N;i++)
a[i]=i; //数组初开始化
scanf("%d",&n);
while(lim!=top) //头尾相同时,查找失败
{
mid=(int)(lim+top)/2; //获取数组中间索引
if (n>a[mid])
lim=mid+1;
else
{
if(n<a[mid])
top=mid;
else
{
printf("match item is a[%d]",mid);
getch();
return;
}
}
}
printf("No match item.\n");
getch();
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
创作者6sub1Zunpi
2019-08-01 · TA获得超过3.8万个赞
知道大有可为答主
回答量:1.2万
采纳率:29%
帮助的人:973万
展开全部
这是测试过的正确的代码给你对比下把
1、折半查找算法如下:
int
Search_Bin(SqTable
st,int
k)
{
int
low=1,high=N,mid;
while
(
low
<=
high
)
{
mid=(low+high)/2;
//取得查找表的中间位置
if
(
k
==
st.data[mid]
)
//找到
return
mid;
//mid位置的元素为找寻元素
else
if
(
k
<
st.data[mid]
)
//向前折半查找
high=mid-1;
else
//向后折半查找
low=mid+1;
}
return
0;
//未找到
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zyueqi
2009-01-02 · TA获得超过167个赞
知道小有建树答主
回答量:348
采纳率:0%
帮助的人:273万
展开全部
这是测试过的正确的代码给你对比下把
1、折半查找算法如下:
int Search_Bin(SqTable st,int k)
{ int low=1,high=N,mid;
while ( low <= high )
{
mid=(low+high)/2; //取得查找表的中间位置
if ( k == st.data[mid] ) //找到
return mid; //mid位置的元素为找寻元素
else if ( k < st.data[mid] ) //向前折半查找
high=mid-1;
else //向后折半查找
low=mid+1;
}
return 0; //未找到
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式