二分查找是一种效率较高的搜索算法,适用于已经排序好的数组。其过程如下:
- 初始化: 确定搜索范围的起始点
low
和结束点high
。初始时,low
为数组起始位置,high
为数组末尾位置。 - 中间元素: 计算中间元素的下标
mid
,即mid = (low + high) / 2
。
如果担心出现整形溢出的情况,可以修改为mid=low+(high-low)/2 - 比较与调整: 将要搜索的元素与中间元素进行比较。
- 如果要搜索的元素等于中间元素,则找到了目标元素,返回中间元素的下标。
- 如果要搜索的元素小于中间元素,则更新
high = mid - 1
,即将搜索范围缩小为左半部分。 - 如果要搜索的元素大于中间元素,则更新
low = mid + 1
,即将搜索范围缩小为右半部分。
- 重复直到找到目标或搜索范围为空: 重复步骤 2 和 3,直到搜索范围为空(即
low > high
),此时目标元素不在数组中。
这个过程可以用递归或循环实现。在实际应用中,二分查找的时间复杂度为 O(log n),是一种非常高效的搜索算法。
参考代码如下:
先定义一个名为binary_search()的函数,定义好left、right、mid等变量,注意,判断条件是while(left<=right),此处容易漏=,在二分查找算法中,当更新 left
和 right
指针时,应该包括当前中间元素 mid
,因为我们已经比较过 arr[mid]
与目标值 k
,如果不包含 mid
则会错过某些情况。
!!!易错点:可不可以在自定义函数内部算出sz(数组长度)的值???
是不可以的!
因为数组传参的时候,传的只是数组的首元素地址,而不是整个数组!!!
所以不能在自定义函数内部计算数组长度(会用到arr,此时arr只是一个指针地址)