介绍
二分查找法是一种十分基础的算法,他可以使得搜索的复杂度变为O(logn),每次写二分查找,都免不了调试边界条件,故写下此文,以后写二分查找好有统一写法。
代码
//left是最左侧可达到的序号
//right是最左侧可达到的序号
int binarySearch(int a[],int key,int left,int right){
while(left + 1 < right){
int mid = (left + right) / 2;
if (a[mid] == key)
return mid;
if (a[mid] < key)
left = mid;
else
right = mid;
}
//这样写无法查找到最左侧和最右侧的元素
//因此要单独判断
if(a[left] == key)
return left;
if(a[right] == key)
return right;
return -1;
}
如果在函数一开始,让left - 1,right + 1,把范围扩大一下,就可以省略最后的单独判断的环节。
最终代码:
//left是最左侧可达到的序号
//right是最左侧可达到的序号
int binarySearch(int a[], int key, int left, int right){
left--;
right++;
while(left + 1 < right){
int mid = (left + right) / 2;
if(a[mid] == key)
return mid;
if(a[mid] < key)
left = mid;
else
right = mid;
}
return -1;
}