二分法搜索并不是什么很高深的算法,任何时候需要编写一个这样的算法恐怕都不是难事,甚至c++标准库里已经有相关数但是当现在的我看到二分法搜索的代码仁需要想一想是否确实是这样写的时候,我就知道我应该要写一篇这样的总结,把我对二法这个说难不难的问题梳理归纳一下,这样即使以后忘记了也能够比较完整地回忆起这方面的内容。
分法检索的目的一般有两个,一个是判断某数是否存在与一个有序数列之中(包括单调函数列),另一个是得到数列中第一个大于等于这个数或第一个小于等于这个数的数的索引一般来讲,第二个目的要求要更高一些 ;
下面是我对两种二分检索的归纳:
#include <iostream>
using namespace std;
//先写满足第一个目的的:
bool binary_search_1(int a[], int left, int right, int key){
//这里是int 数组,实际可以是double等
while (left <= right){
int mid = (left + right) / 2;
if (a[mid] == key) return true; //或 return 1;
else if (a[mid] > key) right = mid - 1;
else left = mid + 1;
}
return false; //也可以是 return 0;
}
/*
注意: 1.其实right = mid 也可以,而且while判断用 (left < right)就足够了(加=也可)
2.用 right = mid - 1 效率稍高一点点,但是要和 while (left <= right)搭配
3.千万不要用left = mid,否则容易陷入死循环 ;
*/
//再写满足第二个目的的:
int binary_search_2(int a[], int left, int right, int key){
while (left < right){
int mid = (left + right) / 2;
if (a[mid] == key) return mid;
else if (a[mid] > key) right = mid;
else left = mid + 1;
}
return left;
}
/*
注意: 1.这里一定要用right = mid;(不可以用right = mid - 1);
2.最后一行用 return left 返回第一个大于等于的数的索引,也就是upper_bound;
3.如果用 return left - 1 则返回第一个小于等于的索引,也就是lower_bound;
*/
int main(){
cout << "This is something about binary_sort().\n";
return 0;
}