二分查找
前提条件
当我们需要搜索的目标所在的集合为有序数组时,可以通过二分查找进行优化筛选次数从而降低搜索时间
实现过程 (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
小结
二分查找的小细节,边界处理折中的时候会遗漏筛选元素,做好边界处理即可