标签:
/* 二分查找 普通版 bs(); 求下界 low_bs(); 求上界 up_bs(); */ #include <cstdio> #include <algorithm> using namespace std; //[l,r) int bs(int *T,int l,int r,int v) { int m; while(l<r) { m = l +(r - l) / 2; //注意 >>1 要加括号 if(T[m] == v) return m; if(T[m] < v) l = m+1; else r = m; } return -1; //-1表示未找到 } //寻找值为v的第一个下标l //代表从[l,r)中寻找下界所在的区间[l,r] int low_bs(int *T,int l,int r,int v) { int m; while(l<r) { m = l + (r-l) / 2; if(T[m] >= v) r = m; else l = m+1; } return l; } //返回等于v最后一个元素后面的一个下标r int up_bs(int *T,int l,int r,int v) { int m; while(l<r) { m = l + (r - l) / 2; if(T[m] <= v) { l = m + 1; } else { r = m; } } } int a[100]; int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); int v; scanf("%d",&v); sort(a,a+n); //DONT FORGET!! printf("该元素的某个位置为%d\n",bs(a,0,n,v)); printf("该元素所在区间为[%d,%d]",low_bs(a,0,n,v),up_bs(a,0,n,v)-1) ; //STL scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); scanf("%d",&v); printf("lower_bound = %d\nupper_bound = %d\n",lower_bound(a,a+n,v) - a,upper_bound(a,a+n,v) - a); return 0; }
参考刘汝佳<入门经典>
标签:
原文地址:http://blog.csdn.net/snk1996/article/details/45445225