美文网首页
数据接口- 二分查找、floor、ceil

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

作者: 羽裳有涯 | 来源:发表于2020-04-02 11:09 被阅读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

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

相关文章

网友评论

      本文标题:数据接口- 二分查找、floor、ceil

      本文链接:https://www.haomeiwen.com/subject/cdgtphtx.html