折半查找法

来源:百度知道 编辑:UC知道 时间:2024/05/31 00:13:48
#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();
}
请问这个错在哪?
请将详细点,我是初学。谢谢

这是从你的代码中改过来的
你的问题就是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();
}

首先,你定义mid=1/2*(lim+top)时,就已经定义了mid=0,然后你又没有让mid的值发生改变,然后,lim,或者top的值就只能为0了,程序是个无限循环,你应该定义mid的类型为float就行了

这是测试过的正确的代码给你对比下把
1、折半查找算法如下:
int Search_Bin(SqTable st,int k)
{ int low=1,high=N,mid;
while ( low <= high )
{
mid=(low+high)/2; //取得查找表的中间位置
if (