提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
文章总体出自博主英雄出自哪里的5点直播
英雄出自哪里
一、二分查找本质是什么?
对于一个单调函数y=f(x)而言,已知一个y,如何得到一个x?
这便是二分查找要干的事!当一个数组元素的值已知的情况下,如何求数组下标;
也就是x = f(-1)(y);即反函数的概念!
二、二分查找的原理
1.原理
对于单调函数f(x)而言的:
找到值为y1的自变量x1的值;
一开始有两个游标left 和 right分别指向函数的定义域的两个端点,也就是[left, right]这个区间 y=f(x)的取值范围。
而后取定义域的中点 mid = (left + right)/2;
分三种情况讨论
(1)f(mid) == f1,则直接返回mid;
(2)f(mid) > f1,则要查找的f1,一定在mid的左边;
(3)f(mid) < f1,则要查找的f1,一定在mid的右边
于是转化成求更小子区间上的同样问题!(有递归的感觉了)
三、二分查找的实现
我们把这件事抽象出来,用一个函数binarySearch(arr, l, r)来表示在数组arr的区间 [l,r] 上找值为y1的下标,如果没找到则返回-1.
int f(int *arr, int x) {
return arr[x];
}
int binarySearch(int *arr, int l, int r, int v) {
if(l > r) {
return -1; // (1)
}
if(l == r) {
return arr[l] == v ? l : -1; // (2)
}
int mid = (l + r) >> 1; // (3)
int fv = f(arr, mid); // (4)
if(fv < v) {
return binarySearch(arr, mid+1, r, v); // (5)
}else if(fv > v) {
return binarySearch(arr, l, mid-1, v); // (6)
}
return mid; // (7)
}
代码与图来自 “英雄出自哪里” 英雄哥csdn链接