数据接口- 二分查找、floor、ceil

2020-04-02  本文已影响0人  羽裳有涯

二分查找

二分查找(Binary earch),也称为折半查找。它的前提是线性表中的记录必须是关键码有序(通常从小到大有序) ,线性表必须采用顺序存储

基本思想

代码

#pragma mark --二分查找

int binarySearch(int *arr, int n, int i) {
    int l = 0;
    int r = n - 1;  //在[l...r]的范围内寻找target
    int mid;
    while (l <= r) {
        mid = l + (r - l)/2;
        if (i == arr[mid]) {
            
            return mid;
        }
        if (i > arr[mid]) {
            l = mid + 1;
        }
        if (i < arr[mid]) {
            r = mid - 1;
        }
    }
    return -1;
}

void binarySearch_start(int *arr, int n)
{
    int i = rand() % n;
    int mid = binarySearch(arr, n, arr[I]);
    if (mid != -1) {
         printf("找到了i= %d  == %d",i,mid);
    }else {
        printf("没有找到");
    }
}

floor

当存在大量重复元素时,floor找的是第一个;
当不存在指定的元素时,floor是比其小最大的一个。

int binarySearch_floor(int *arr, int n, int k) {
    int l = -1;
    int r = n - 1;
    while (l < r) {
        // 使用向上取整避免死循环
        int mid = l + (r - l + 1)/2;
        if (k >= arr[mid]) {
            l = mid;
        }
        if (k < arr[mid]) {
            r = mid - 1;
        }
    }
    if (l + 1 < n -1 && arr[l + 1] == k) {
        return l + 1;
    }
    return l;
}

image.png image.png

ceil

上一篇 下一篇

猜你喜欢

热点阅读