其实我们平时翻书时就不自觉的用了类似二分查找的算法,知道要找哪一页X,然后随手翻到一个中间位置,X小于该页数,则继续翻前面的部分,否则只翻后面的部分.
注意:使用二分查找的数组必须是已经排好序的
方法1 :使用递归思想
//返回值是查询值的索引(索引是从0开始计数的),left,right是左边与右边的索引,val是待查询的值
int BinarySearch(int* arr, int left , int right, int val)
{
if( left > right) return -1; //没找到val
int mid = (left + right) / 2;
if( arr[mid] == val)
return mid; //找到了
else if( val < arr[mid])
return BinarySearch(arr, left, mid - 1, val);
else if( val > arr[mid])
return BinarySearch(arr, mid + 1, right, val);
return -1;
}
方法2:不使用递归
int BinarySearch(int* arr , int left , int right, int val)
{
while( left <= right)
{
int mid = (left + right) / 2;
if( val == arr[mid]) return mid;
else if( val < arr[mid])
right = mid - 1;
else if( val > arr[mid])
left = mid + 1;
}
return -1;
}