// arr有序
// 二分查找
#include <stdio.h>
// 第一个 >= val 的 index
int lower_bound(int arr[], int num, int val)
{
int l = 0, r = num-1;
if (arr[r] < val) {
// printf("val:%d, too large\n\n", val);
return -1;
}
while (l < r)
{
int mid = l + (r-l) / 2;
if (arr[mid] < val)
{
l = mid + 1;
}
else
{
r = mid;
}
}
// printf("val:%d, l:%d, arr[l]:%d\n\n", val, l, arr[l]);
return l;
}
// 第一个 > val 的 index
int upper_bound(int arr[], int num, int val)
{
int l = 0, r = num-1;
if (arr[r] <= val) {
// printf("val:%d, too large\n\n", val);
return -1;
}
while (l < r)
{
int mid = l + (r-l) / 2;
if (arr[mid] <= val)
{
l = mid + 1;
}
else
{
r = mid;
}
}
// printf("val:%d, l:%d, arr[l]:%d\n\n", val, l, arr[l]);
return l;
}
// 返回 [st, ed)
// *st == -1 || ret == -1 表示数组中没有val
int equal_bound(int arr[], int num, int val, int *st, int *ed)
{
*st = lower_bound(arr, num, val);
*ed = upper_bound(arr, num, val);
if ( (*st == -1) || (arr[*st] != val) ) {
*st = -1;
return -1;
}
if (*ed == -1) {
*ed = num;
}
return 0;
}
int main(void)
{
int arr[] = {3, 5, 5, 9};
int num = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < arr[num-1] + 2; i++)
{
lower_bound(arr, num, i);
}
for (i = 0; i < arr[num-1] + 2; i++)
{
upper_bound(arr, num, i);
}
for (i = 0; i < arr[num-1] + 2; i++)
{
int st, ed, ret;
ret = equal_bound(arr, num, i, &st, &ed);
printf("ret:%d, val:%d, st:%d, ed:%d\n\n", ret, i, st, ed);
}
}
lower_bound&upper_bound&equal_bound实现
最新推荐文章于 2024-10-15 19:28:18 发布