折半查找
1.基本思路
在数组中给出一组有序数(前提是一组有序数),查找一个数是否在此数组中;不断取数组的中间值,将这个中间值与要查找的数字比大小,如果,这个要查找的数比中间值大的话,在后半部分查找,否则在前半部分查找;直到有中间值与要查找的值一致时,返回数组下标,循环结束;
2.代码
#include <stdio.h>
int BinSearch(int *arr,int len,int key)
{
int mid;
int low=0;
int high=len-1;
while(low<=high)//当low=high时也要比较arr[low]与key的大小,所以一定要加等号;
{
mid=(low+high)/2;
if(arr[mid]==key)
{
return mid;
}
else if(arr[mid]<key)
{
low=mid+1;//必须要加一,因为arr[mid]与key已经判断过相等的情况,否则会进入死循环;在后半部分查找
}
else
{
high=mid-1;//在前半部分查找
}
}
return -1;//要查找的值不在数组中;
}
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
for(int i=0;i<13;i++)
{
printf("%d ",BinSearch(arr,sizeof(arr)/sizeof(arr[0]),i));
}
}//从0到12依次在数组arr中查询
调试结果:
-1 0 1 2 3 4 5 6 7 8 9 -1 -1