下标从1开始,返回长度为n的数组a中最后一个等于key的下标
int search1(int a[], int n, int key){
int l = 1, r = n, ans;
while (l <= r){
int mid = (l + r) / 2;
if (a[mid] <= key){
l = mid + 1;
ans = mid;
}else{
r = mid - 1;
}
}
return a[ans]==key ? ans : -1;
}
下标从1开始,返回长度为n的数组a中最第一个等于key的下标
int search2(int a[], int n, int key){
int l = 1, r = n, ans;
while (l <= r){
int mid = (l + r) / 2;
if (a[mid] < key){
l = mid + 1;
}else{
r = mid - 1;
ans = mid;
}
}
return a[ans] == key ? ans, -1;
}
low_bound、upper_bound
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int a[11]={
0,1,2,3,4,4,4,5,6,7,8};
//lower_bound(begin, end, key)
//二从数组的begin位置到end-1位置二分查找第一个大于或等于key的数字,
//找到返回该数字的地址,不存在则返回end。
int pos = lower_bound(a+1, a+10+1, 4) - a;
cout<<pos<<endl;
//upper_bound(begin, end, key)
//从数组的begin位置到end-1位置二分查找第一个大于key的数字,
//找到返回该数字的地址,不存在则返回end。
int pos2 = upper_bound(a+1, a+10+1, 4) - a;
cout<<pos2<<endl;
return 0;
}