📅  最后修改于: 2023-12-03 14:50:51.677000             🧑  作者: Mango
在 C 中,我们可以使用二分搜索算法实现 'upper_bound()' 和 'lower_bound()' 函数。这两个函数分别用于在已排序的数组中找到第一个大于等于/大于指定值的元素的位置和第一个小于等于/小于指定值的元素的位置。
代码如下:
#include <stdio.h>
int lower_bound(int arr[], int n, int x) {
int l = 0, r = n - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (arr[mid] == x) {
return mid;
}
else if (arr[mid] < x) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
return l;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int x = 3;
int idx = lower_bound(arr, n, x);
printf("%d\n", idx); // output: 2
return 0;
}
其中,'lower_bound()' 函数的参数包括排序后的数组 'arr[]'、数组长度 'n' 以及需要查找的值 'x'。 首先定义左右两个边界指针(左闭右闭区间),当左指针小于等于右指针时,进行循环。在循环中,我们计算中间位置 'mid',如果 'arr[mid]' 的值小于 'x',则将左指针 'l' 向右移动,反之将右指针 'r' 向左移动。如果 'arr[mid]' 值等于 'x',则直接返回 'mid' 作为答案。最后,如果没有找到,则当前左指针 'l' 就是第一个大于等于 'x' 的位置。
类似于 'lower_bound()' 函数,'upper_bound()' 函数的代码如下:
#include <stdio.h>
int upper_bound(int arr[], int n, int x) {
int l = 0, r = n - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (arr[mid] <= x) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
return l;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int x = 2;
int idx = upper_bound(arr, n, x);
printf("%d\n", idx); // output: 2
return 0;
}
在该代码中,我们同样定义左右边界指针,当左指针小于等于右指针时,进行循环。在循环中,我们计算数组的中间位置 'mid',看 'arr[mid]' 是否小于等于给定值 'x',如果是,就将左指针向右移动,否则将右指针向左移动。最后,如果没有找到,则当前左指针 'l' 就是第一个大于 'x' 的位置。
通过本文示例中的代码,我们可以实现在 C 语言中纯手写 版本出的 'upper_bound()' 和 'lower_bound()' 函数。这两个函数非常好用且能够帮助我们迅速在数组中找到任意一个指定值或者指针。如果你在写 C 语言时,需要在已排序数组中查找特定位置,可以尝试使用这两个函数。