二分搜索:lower_bound, upper_bound

来源:互联网 发布:linux修改系统日期 编辑:程序博客网 时间:2024/04/30 04:26

#include <iostream>  #include <cstdio>  using namespace std;  const int MAX_N = 100;  int N, M;  int a[MAX_N] = {2, 3, 3, 5, 6};int lower_bound(int a[], int n, int key){int l = 0, r = n;while(r > l){int mid = (l+r) /2;if(a[mid] < key)l = mid+1;//查找右边区域:[mid+1, r]elser = mid;//查找左边区域:[l, mid]}return r;}int upper_bound(int a[], int n, int key){int l = 0, r = n;while(r > l){int mid = (l+r) /2;if(a[mid] <= key)l = mid+1;elser = mid;}return r ;}int main()  {  //freopen("in.txt", "r", stdin);  N = 5;int key;for(int i = 0; i < N; i++)printf(i == N-1 ? "%d\n" : "%d ", a[i]);while(scanf("%d", &key) != EOF){int low = lower_bound(a, N, key);int up = upper_bound(a, N, key);printf("low: %d, up: %d\n", low, up);}return 0;  }  


int lower_bound1(int a[], int n, int key)  {  int l = -1, r = n;  while(r > l + 1)  {  int mid = (l+r) /2;  if(a[mid] >= key)  r = mid; //查找左边区域:(l, mid]  else  l = mid;//查找右边区域:(mid, r]}  return r;  }  int upper_bound1(int a[], int n, int key)  {  int l = -1, r = n;  while(r > l + 1)  {  int mid = (l+r) /2;  if(a[mid] > key)  r = mid; //查找左边区域:(l, mid]  else  l = mid;//查找右边区域:(mid, r]}  return r;  }  


数据测试:

2 3 3 5 6
0
low: 0, up: 0
1
low: 0, up: 0
2
low: 0, up: 1
3
low: 1, up: 3
4
low: 3, up: 3
5
low: 3, up: 4
6
low: 4, up: 5
7
low: 5, up: 5

0 0
原创粉丝点击