📌  相关文章
📜  用于排序数组中的天花板的 C 程序(1)

📅  最后修改于: 2023-12-03 15:11:16.840000             🧑  作者: Mango

用于排序数组中的天花板的 C 程序介绍

在某些场景中,我们需要查找一个数组中最接近给定值的元素,这个值被称为“天花板”。而在排序后的数组中,天花板指的就是第一个大于或等于给定值的元素。

本文将带领读者了解如何使用 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 语言的天花板查找算法在数组有序的情况下时间复杂度较低,适合处理大量数据场景。同时,本文也给出了完整的算法代码示例,可以直接复制粘贴使用。