二分查找是利用分治思想减小问题规模的一种查找算法,二分查找的序列必须是有序的。
c/c++实现的算法如下:
/*递归算法, bsearch_recursion.c*/
int bsearch_recursion(int array[], int low, int high, int key)
{
int mid_index, mid_value;
mid_index = low + (high - low) / 2;
mid_value = array[mid_index];
if (low < high && key != mid_value) {
if (key > mid_value) return bsearch_recursion(array, mid_index + 1, high, key);
if (key < mid_value) return bsearch_recursion(array, low, mid_index - 1, key);
} else if (key == mid_value)
return mid_index;
else
return -1;
}
/*循环算法, bsearch_loop.c*/
int bsearch_loop(int *array, int low, int high, int key)
{
int mid_index = low + (high - low) / 2;
int mid_value = *(array + mid_index);
while (low < high && key != mid_value) {
if (key > mid_value)
low = mid_index + 1;
if (key < mid_value)
high = mid_index - 1;
mid_index = low + (high - low) / 2;
mid_value = *(array + mid_index);
}
return (*(array + mid_index) == key ? mid_index : -1);
}
//bsearch.cpp
bool bsearch(std::vector<int>ivec, int target)
{
auto begin = ivec.begin(), end = ivec.end(),
mid = begin + (end - begin) / 2;
while (begin != end && *mid != target) {
if (*mid > target)
end = mid - 1;
else
begin = mid + 1;
mid = begin + (end - begin) / 2;
}
return *mid == target;
}