您的位置:首页 > 其它

折半查找

2015-10-17 00:26 281 查看
从表列中查一个数最简单的方法是从第1个数开始顺序查找,将要找的数与表列中的数一一比较,直到找到为止(如果表列中无此数,则应找到最后一个数,然后判定“找不到”)但这种“顺序查找法”效率较低。如果表列中有1000个数,且要找的数恰恰是第1000个数,则要进行1000次比较才得到结果。平均比较次数为500次。
折半查找法是效率较高的一种方法,基本思路如下:
假如有已按由小到大排好序的9个数,A[1]--A[9]
其值分别为:1 3 5 7 9 11 13 15 17
若输入一个3,想查3是否在此数列中,先找出表列中居中的数,即a[5]
将要找的数3与a[5]比较,a[5]的值是9,发现a[5]>3,显然3应当在a[1]到a[5]之间
这样可以缩小查找范围;再找a[1]到a[5]范围内的居中的数,即a[3]
将要找的数3与a[3]比较,a[3]的值为5,发现a[3]>3,显然3应当在a[1]到a[3]范围内
再将查找范围缩小一半,与a[1]到a[3]范围内的居中的数a[2]比较,发现要找的数3等于a[2],查找结束,一共比较了3次。在一个有序数组中,折半查找也就是利用二分法的思想找出数组中的内容。代码如下:
#include<stdio.h>

int binsearch(int x,int arr[],int left,int right)
{
while(left<=right)
{
int mid=left-(left-right)/2;/*注意此处一定要是"<="*/
/*为何此处不写成mid=(left+reght)/*由于此写法可能会导致溢出*/
if(arr[mid]==x)
{
return mid;
}
else if(x<arr[mid])
{
right=mid-1;
}
else
{
left=mid+1;
}
}
return -1;
}

int main()
{
int arr[]={1,7,54,87,121,312,938};
int vet,num;
scanf("%d",&num);
vet=binsearch(num,arr,0,sizeof(arr)/sizeof(arr[0])-1);
if(vet!=-1)/*调用外函数,返回值赋给了vet*/
{
printf("%d",arr[vet]);
}
else printf("not exist");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  折半查找 二分法