折半查找也称为二分查找,是一个很优秀的算法,实现简单,并且时间复杂度很低,为log以二为底n的对数。
要求是一组有序排列的数组,定义三个指针low,high,mid,分别指向数组的首部,尾部和中间位置。所要查找的关键字每次都与中间指针对应位置的数值进行对比,假设小于指针mid,则将指针high指向mid-1的位置,同理,如果大于指针mid,则将指针low指向mid+1的位置,每次可以将数组一半的数值排除。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int BS(int *str,int len,int key)
{
int low = 0;
int high = len-1;
int index =-1;
while(low <= high)
{
int mid = (low+high)/2;
if(key == str[mid])
{
index = mid;
break;
}
else if(key > str[mid])
{
low = mid+1;
}
else
{
high = mid-1;
}
}
return index;
}
int main()
{
int str[] = {0,1,2,3,4,5,6,7,8,9};
int len =sizeof(str)/sizeof(str[0]);
printf("%d\n",BS(str,len,0));
return 0;
}