查找步骤:
将当前元素区间根据中间值划分成左右两个区间。
然后用中间值与目标值进行比较。
如果目标值等于该中间值,找到直接返回。
如果目标值比中间值大,则继续在右边区间查找。
如果目标值比中间值小,在继续在左边区间查找。
注意事项:
二分查找又叫折半查找,要求当前区间必须已经有序。
代码实现:
循环形式
int BinarySearch(int* pData, int size, int value)
{
if (nullptr == pData || size < 1) return -1;
int begin = 0;
int end = size - 1;
while (begin <= end)
{
int middle = (begin + end) / 2;// 可能会溢出,使用middle = begin + (end - begin) / 2;
if (value == pData[middle]) return middle;
else if (value < pData[middle]) end = middle - 1; // 在左边区间查找
else begin = middle + 1; // 在右边区间查找
}
return -1; // 未找到
}
递归形式
int BinarySearch(int* pData, int value, int begin, int end)
{
if (nullptr == pData) return -1;
if (begin > end) return -1; // 未找到
int middle = begin + (end - begin) / 2; // 比 middle = (begin + end) / 2;更好
if (value == pData[middle]) return middle;
else if (value < pData[middle]) end = middle - 1;
else begin = middle + 1;
return BinarySearch(pData, value, begin, end);
}