递归版:
int bin_find(vector<int> v,int des,int low,int hi) {
if (low >= hi) return -1;
int mid = (low + hi) / 2;
if (v[mid] == des)
return mid;
if (des < v[mid])
return bin_find(v, des, low, mid);
else if (des > v[mid])
return bin_find(v, des, mid + 1, hi);
}
迭代版:
int bin_find(vector<int> v, int des) {
int lo=0,hi = v.size(),mid = (lo+hi)/2;
for (int i = v.size(); i > 0; i /= 2) {
if (mid >= v.size())
return -1;
if (v[mid] == des)
break;
if (des < v[mid])
hi = mid;
else
lo = mid + 1;
mid = (lo + hi) / 2;
}
if (v[mid] != des) mid = -1;
return mid;
}
拓展
寻找最接近输入值des但比输入值小的数(基于迭代),无论数组里有无这个输入值,我们都返回比它小一点的那个值的下标
int bin_find_less(vector<int> v, int des) {
int lo = 0, hi = v.size(), mid = (lo + hi) / 2;
for (int i = v.size(); i > 0; i /= 2) {
if (mid >= v.size())
{
mid = v.size(); break;
}
if (v[mid] == des)
break;
if (des < v[mid])
hi = mid;
else
lo = mid + 1;
mid = (lo + hi) / 2;
}
return mid-1;
}
寻找输入值des,如果找不到,返回最接近该输入值但比它小的数的下标。
int bin_find1(vector<int> v, int des) {
int lo = 0, hi = v.size(), mid = (lo + hi) / 2;
for (int i = v.size(); i > 0; i /= 2) {
if (mid >= v.size())
{
return v.size() - 1;
}
if (v[mid] == des)
break;
if (des < v[mid])
hi = mid;
else
lo = mid + 1;
mid = (lo + hi) / 2;
}
if (v[mid] != des) mid -= 1;
return mid;
}