1. 关于二分查找
二分查找主要是为了解决“在一堆数中找出指定的数”这类问题。
要想二分查找,这一堆数必须有以下特征:
- 存储在数组中
- 有序排列
至于是顺序递增还是递减,是否存在相同的元素都不要紧。
2. 算法实现
2.1 分治法
#include <iostream>
#include <string>
using namespace std;
int binarySearch(int array[], int low, int high, int target)
{
if (low > high)
{
return -1;
}
int mid = (low + high) / 2;
if (array[mid] > target)
{
return binarySearch(array, low, mid - 1, target);
}
if (array[mid] < target)
{
return binarySearch(array, mid + 1, high, target);
}
// array[mid] == target
return mid;
}
int main()
{
int array[4] = {1, 4, 5, 7};
cout<<binarySearch(array, 0, sizeof(array) - 1, 5)<<endl;
return 0;
}
2.2 非递归法
#include <iostream>
#include <string>
using namespace std;
int binarySearch(int array[], int size, int target)
{
int left = 0;
int right = size - 1;
while (left <= right)
{
int mid = left + ((right - left) / 2);
if (array[mid] > target)
{
right = mid - 1;
}else
if (array[mid] < target)
{
left = mid + 1;
}else
{
return mid;
}
}
return -1;
}
int main()
{
int array[4] = {1, 4, 5, 7};
cout<<binarySearch(array, sizeof(array), 5)<<endl;
return 0;
}
注意:求中间索引值时,使用 left + ((right - left) / 2) 防止溢出。