#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]
else
r = 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;
else
r = 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