📅  最后修改于: 2023-12-03 15:11:16.840000             🧑  作者: Mango
在某些场景中,我们需要查找一个数组中最接近给定值的元素,这个值被称为“天花板”。而在排序后的数组中,天花板指的就是第一个大于或等于给定值的元素。
本文将带领读者了解如何使用 C 语言编写能够在已排序的数组中查找天花板的程序。
最简单直接的方法是遍历整个数组,从前往后寻找大于或等于给定值的元素,时间复杂度为 O(n)。
另一种方法是使用二分查找。二分查找是针对排序好的序列进行的。每次取中间点的值,如果小于要查找的值,则在右半部分继续查找;如果大于或等于要查找的值,则在左半部分继续查找。这样每次查找都可以将剩余的规模折半,时间复杂度为 O(logn)。
这个过程使用二分查找实现,即不断缩小查找区间,最终找到第一个大于或等于给定值的元素。
int findCeiling(int arr[], int n, int key) {
if (key > arr[n-1])
return -1;
int left = 0, right = n - 1;
while (left <= right) {
int mid = left + (right-left)/2;
if (arr[mid] == key)
return mid;
if (arr[mid] < key) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return left;
}
其中 arr
是数组,n
是数组元素个数,key
是要查找的值。如果找到了,返回其下标;如果没找到,则返回第一个大于该值的元素下标。
完整代码加上测试如下:
#include <stdio.h>
int findCeiling(int arr[], int n, int key) {
if (key > arr[n-1])
return -1;
int left = 0, right = n - 1;
while (left <= right) {
int mid = left + (right-left)/2;
if (arr[mid] == key)
return mid;
if (arr[mid] < key) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return left;
}
int main() {
int arr[] = {1, 2, 4, 7, 10, 14, 15};
int n = sizeof(arr)/sizeof(arr[0]);
int key = 6;
int ceilIndex = findCeiling(arr, n, key);
if (ceilIndex == -1)
printf("Ceiling of %d doesn't exist in the array\n", key);
else
printf("Ceiling of %d is %d\n", key, arr[ceilIndex]);
return 0;
}
以上代码在给定的数组中找到 key = 6
的天花板,并输出结果 Ceiling of 6 is 7
。
C 语言的天花板查找算法在数组有序的情况下时间复杂度较低,适合处理大量数据场景。同时,本文也给出了完整的算法代码示例,可以直接复制粘贴使用。