二分法搜索並不是什麼很高深的算法,任何時候需要編寫一個這樣的算法恐怕都不是難事,甚至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;
}