在进行二分查找时,最需要注意的有以下几点:
- 要查找的对象是否是有序的,是升序的还是降序的,不同的顺序有不同的处理方法
- 给出查找对象的区间,是 [ ],还是 [ )
- 递归出口,根据给出的区间递归出口要注意,[ ]对应出口为left <= right,[ )对应出口left < right
以下程序是默认为升序排列,使用的是 [ ) 区间进行二分查找的一个模板函数,函数返回的是目标所对应的下标:
template<class T>
int BinaryFind(T* arr, int left, int right, T key)
{
if (arr)
{
//递归出口
if (left < right)
{
//平均值的一种求法(避免数据溢出问题)
int mid = ((left ^ right) >> 1) + (left & right);
if (arr[mid] < key)
{
//因为给出的是[ )形式的区间,所以mid要加上1
return BinaryFind(arr, mid + 1, right, key);
}
else if (arr[mid] > key)
{
//因为给出的是[ )形式的区间,在这mid不用加1
return BinaryFind(arr, left, mid, key);
}
else
{
return mid;
}
}
}
return -1;
}