二分查找是一种基础又重要的算法,能够快速锁定某个值在 有序 列中的位置。
其原理与我们在中学数学中学到的二分法是相同的,即先找到中间值,如果中间值大于目标值,则在最小值与中间值之间继续二分查找;如果中间值小于目标值,则在中间值与最大值之间继续二分查找。
书中给出了两种实现方法,分别是迭代与递归,这里更推荐使用迭代实现
P.S. 这里未命中会一直递归,推荐对代码做成相应更改,并用return -1表示未命中。详见注释
template<typename key>
int binary_search(key a[],int n, key target) //迭代法二分查找
{
int low = 0, high = n - 1;
while (low <= high)//此处在未命中时不会结束,可以改为while(low<high)
{
int mid = low + (high - low)/2;
if (target < a[mid])
{
high = mid;
}
else if (target > a[mid])
{
low = mid;
}
else
return mid;
}
return low;//推荐return -1 表示未命中
}
template<typename key>
int binary_search(key a[], int n, key target, int low, int high) //递归的二分查找
{
if (high < low) //此处在未命中时不会结束,可以改为high<=low。
return low;//推荐return -1 表示未命中
int mid = low + (high - low) / 2;
if (target < a[mid])
{
binary_search(a, n, target, low, mid);
}
else if (target > a[mid])
{
binary_search(a, n, target, mid, high);
}
else
return mid;
}
运行结果: