1、前言
在一个长度为t的顺序数组中,寻找目标为target的值,找到则返回该值在数据中的位置,否则返回-1.
2 算法实现描述
二分查找法通过对数组的范围跟踪来解决问题。开始时,范围是整个数组,通过将范围中间的元素与目标target值比较并丢弃一半范围,范围被缩小一半,这个过程将一直持续,直到target值被发现,或那个能够包含target范围已为空。
举例说明:在一个长度为7的顺序数组中寻找目标值为7的二分查找法图例
第一步:比较数组中间元素和目标值target
第二步:范围缩小一半,继续比较缩小后的数组中间元素和目标值target
第三步:范围缩小一半,继续比较缩小后的数组中间元素和目标值target
3 算法伪代码实现
arr[arrSize]
targetVal
midIndex
low <- 0
high <- arrSize-1
while low<=high do
midIndex <- low+(high-low)/2
if(arr[midIndex]<targetVal)
high <- midIndex+1
else if(arr[midIndex]>targetVal)
low <- midIndex-1
else
return 0;
return -1
4 算法C语言实现
#include <stdio.h>
int binary_search(int *pArr,int arrSize,int targetVal)
{
int low=0;
int high=arrSize-1;
int midIndex;
if(pArr==NULL || arrSize<=0)
return -1;
while(low<=high)
{
//midIndex = (low+high)/2;//存在溢出情况
midIndex = low + (high-low)/2;
if(pArr[midIndex] > targetVal)
high=midIndex-1;
else if(pArr[midIndex] < targetVal)
low=midIndex+1;
else
return midIndex;
}
return -1;
}
int main()
{
int loc;
int arr[5]={1,2,5,6,7};
loc=binary_search(arr,sizeof(arr)/sizeof(arr[0]),7);
printf("loc=%d\n",loc);
return 0;
}
参考文献【代码之美】