题目
代码实现二分查找算法,查找递增线性表arr中是否含有目标元素,如果含有则返回这个元素,否则返回-1。
分析实现
首先梳理二分查找算法的基本思想:
- 每次选定数组中的最中间元素
mid
与目标元素target
比较 - 如果
mid
大于target
, 就在右半区间进行下一轮查找 - 如果
mid
小于target
, 就在左半区间进行下一轮查找 - 直到查找到目标元素, 或者区间大小为0(查找失败)。
根据赋予变量的意义不同, 二分查找的实现也有很很多不同的小细节, 在本文的实现中
指针left
和right
表示目标值可能出现的左右界限。
具体实现如下 (此代码已通过上机实验验证):
int binarySearch(vector<int>& arr, int target) {
int n = arr.size();
// [left, right]为要查找的区间
int left = 0, right = n - 1;
int mid;
while (left <= right) {
mid = (left+right)/2;
if (arr[mid] == target)
return mid;
// 切换查找区间为右半段
else if (arr[mid] < target)
left = mid + 1;
else if (arr[mid] > target)
right = mid - 1;
}
return -1;
}
总结分析
二分查找算法的思路并不复杂,但实现时仍不简单,算法中有各种边缘情况(
<
<
<还是
⩽
\leqslant
⩽、
>
>
>还是
⩾
\geqslant
⩾、mid
还是mid+1
),而且这些边界情况稍有处理不慎就会造成访问越界、死循环的错误。
时间复杂度:
O
(
l
o
g
n
)
O(log\ n)
O(log n)
空间复杂度:
O
(
1
)
O(1)
O(1)
扩展阅读推荐: labuladong的题解