有序向量的查找算法
二分查找
将要查找的数和向量中间值比较,若小则往前继续,若大则往后继续。要注意边界取值,左边界变化时应当为:lo=mid+1;右边界变化时应当为hi=mi;
渐进复杂度为0(1.5*logn)
写代码时尽量使用小于号而不是大于号,小于号的次序与排序的次序吻合。
代码:
```cpp
int findd(int a[], int lo, int hi,int e) {
while (lo < hi) {
int mid = (lo + hi) >> 1;
if (e < a[mid])
hi = mid;
else if (a[mid] < e)
lo = mid + 1;
else
return mid;
}
return -1;
}
### Fibonacci查找
二分查找在向左侧时成本更低,向右侧时成本更高,因此考虑将算法的深度向左侧倾斜。即:
成本低的转向多做,成本高的转向少做。
按照斐波那契数来切分,整体为第n个斐波那契数减一的话,则选定元素的左侧元素个数为第n-1个斐波那契数-1.本质上就是按照当前向量的黄金分割点来分割。