非递归实现
//二分查找非递归版本
#include<iostream>
#include<vector>
int binarySearch(std::vector<int> data, int k){
int low = 0;
int high = data.size() - 1;
while(low <= high){ //必须加等号,否则此例中5将找不到
int mid = (low + high) / 2;
if(data[mid] == k)
return mid;
else if(data[mid] > k)
high = mid - 1;
else
low = mid + 1;
}
//std::cout<<"not found"<<std::endl;
//return 0;
return -1; //没有找到,上面注释掉的方法也可以
}
int main(){
std::vector<int> v{2, 3, 5};
int ret = binarySearch(v, 5);
std::cout<<ret;
return 0;
}
递归实现
//二分查找递归版本
#include<iostream>
#include<vector>
int binarySearch(std::vector<int>& data, int k, int low, int high){
int ret = 0;
if(low <= high){
int mid = (low + high) / 2;
if(data[mid] == k){
ret = mid;
//return ret;
}
else if(data[mid] > k)
ret = binarySearch(data, k, low, mid - 1);
else
ret = binarySearch(data, k, low + 1, high);
}
if(low > high){
//std::cout<<"not found"<<std::endl;
//return 0;
return -1; //没有找到
}
else
return ret;
}
int main(){
std::vector<int> v{2, 3, 5};
int ret = binarySearch(v, 2, 0, 2);
std::cout<<ret;
return 0;
}
查找(比较)次数
假设数组a[31],存1-31的数,
二分查找的次数为logN,N是2的幂次方时,查找次数为logN+1。最多查找5次的话,那么N最大可以是31,最小可以是16,最多有31个数。规律应该是这样。
31个数经过5次查找成功的节点数为25−1^{5-1}5−1=16
30个数经过5次查找成功的节点数为25−1^{5-1}5−1-1=15
29个数经过5次查找成功的节点数为25−1^{5-1}5−1-2=14
…
16个数经过5次查找成功的节点数为25−1^{5-1}5−1-15=1
15个数经过5次查找成功的节点数为25−1^{5-1}5−1-16=0