二分法代码分析
二分搜索又称为折半搜索。使用二分时,要确保数列是具有有序性的,通过比较中间值,不断将搜索范围缩小为原来的一半,大大缩短了查找的时间,其时间复杂度为 O ( log n ) O(\log {n}) O(logn)。
在算法竞赛中,二分使用的频率十分广泛,常见的二分问题包括:判断某个值是否出现在数组中,如果出现则求出坐标;找出第一个比X值大的数的坐标;X值第一次出现在数组中的位置等。这些问题都可以统称为“从有序数组中查找值”,求解的过程大致相似,区别在于二分的迭代条件不同,需要根据具体的情况调整。
具体调整的内容有四块:
① left、right的初始值
② while循环的条件
③ 边界变换
④ 返回值
1、常规二分
寻找某一特定值,找到即可返回,其过程为:先找到搜索区间[l, r],然后对mid位置值与待查找值的大小。当value[mid]大于待查找的值时,说明待查找的值位于 [l, mid-1]内;当value[mid]小于待查找的值时,说明待查找的值位于[mid+1, r]内;若二者值相等,则成功匹配。代码如下:
int binarySearchNormal(int arr[], int length, int x) // 数组、数组长度、待查找值
{
int l = 0, r = length - 1, mid; // 搜索空间为[l, r],即左闭右闭,因此决定了下方while的跳出条件
while (l <= r) {
// 当l == r时,搜索空间[l, r]仍不为空,所以要继续循环,因此
mid = l + (r - l) / 2;
if (arr[mid] == x) {