二分法查找又称为折半法查找,基本原理:与数组元素的中点比较,逐步定位到元素X所在的区域,最终查找到该元素。前提是:该元素必需按从小到大或者从大到小的顺序排列。实际当中要查找某个元素,可以先排序,再使用二分法查找。
low<=high是关键;mid=low+high+1或mid=low+1 无关紧要,只是分段的比例不一样。
每一次比较后,可以排除a[Mid]. low=mid+1,high=mid-1;
1.迭代算法为:
int search_binary_for(int a[],int n,int N)
{
int low=0,high=n-1;
int Mid;
while(low<=high)
{
Mid=(low+high+1)/2;
if(N>a[Mid])
{
low=Mid+1;
}
else if(N<a[Mid])
{
high=Mid-1;
}
else
{
return 0;
}
}
return -1;
}
void main(void)
{
int a[]={0,1,2,3,4,5,6,7,8,9,10};
for(int i=0;i<14;i++)
if(-1!=search_binary_for(a,sizeof(a)/sizeof(int),i))
{
printf("Hello,The data %d is find!\n",i);
}
else
{
printf("sorry,The data %d can't be found\n",i);
}
}
递归算法如下:
int search_binary_digui(int a[],int n,int N)
{
static low,high,Mid;
static int count=0;
if (count==0)
{
low=0;
high=n-1;
count++;
}
Mid=(low+high+1)/2;
if (low<=high)
{
if(N>a[Mid])
{
low=Mid+1;
}
else if(N<a[Mid])
{
high=Mid-1;
}
else
{
count=0;
return 0;
}
}
else
{
printf("no finid it\n");
return -1;
}
return search_binary_digui(a,high-low+1,N);
}