有序数组的二分查找

228 阅读1分钟

二分查找

前提条件

当我们需要搜索的目标所在的集合为有序数组时,可以通过二分查找进行优化筛选次数从而降低搜索时间

实现过程 (C语言)

  • 通过递归实现
  • 声明函数
// 二分查找,返回目标的下标
int binary_search(int target, int *src, int start, int end);
  • 定义函数
// 递增集合实现 (PS:递减集合,步骤3 和 4 交换即可)
int binary_search(int target, int *src, int start, int end) {
    // 步骤1
    if (start > end) {
        // 边界问题,目标不存在
        return -1;
    }
    // 折中获取下标
    const int index = (start + end) >> 1;
    // 步骤2
    if (src[index] == target) {
        // 找到目标,返回下标
        return index;
    }
    if (src[index] > target) {
        // 步骤3
        // 目标比元素小,递归查找左区间
        // PS:index - 1,边界问题,去掉已经筛选的当前元素
        return binary_search(target, src, 0, index - 1);
    }
    // 步骤4
    // 目标比元素大,递归查找右区间
    // PS:index + 1,边界问题,去掉已经筛选的当前元素
    return binary_search(target, src, index + 1, end);
}
  • 测试
int main() {
    int list[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    printf("index: %d\n", binary_search(2, list, 0, 9));
    return 0;
}

// 结果  index: 2

小结

二分查找的小细节,边界处理折中的时候会遗漏筛选元素,做好边界处理即可