news 2026/4/16 21:16:29

算法中的二分法(二分查找)详解及示例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法中的二分法(二分查找)详解及示例

一、什么是算法中的二分法?

二分法(Binary Search),又称折半查找,是一种在有序数组中查找某个目标值的高效查找算法。其核心思想是:每次将查找范围分成两半,排除不可能包含目标值的一半,仅在可能包含目标值的另一半继续查找,重复此过程,直到找到目标值或确定目标值不存在。

1. 二分查找的必备条件

  • 数组必须是有序(升序或降序均可,常用升序);
  • 数组支持随机访问如数组、vector等数据结构,链表不适用,因为无法快速定位中间元素)。

2. 二分查找的优势(效率对比)

普通遍历查找(线性查找)相比,二分查找的效率优势极其明显:

  • 线性查找:最坏情况下需要查找n 次(n 为数组长度);
  • 二分查找:最坏情况下仅需要查找log₂(n)次。

示例:当数组长度n = 1000000(100万)时,线性查找最多需要100万次,而二分查找最多仅需约20次,效率差距极大。

3. 二分查找的基本步骤(升序数组通用模板)

  1. 定义查找范围的左边界left = 0(数组起始下标);
  1. 定义查找范围的右边界right = 数组长度 - 1(数组末尾下标);
  1. 设置循环条件left ≤ right(当左边界不大于右边界时,说明还有查找范围);
  1. 计算查找范围的中点:mid = (left + right) / 2(通过中点分割范围);
  1. 比较中点元素 arr[mid]目标值 target
  • arr[mid] == target:找到目标值,返回当前中点下标;
  • arr[mid] < target:目标值在中点右侧,更新左边界 left = mid + 1
  • arr[mid] > target:目标值在中点左侧,更新右边界 right = mid - 1
  1. 循环结束后,若未找到目标值,返回 -1(表示目标值不存在于数组中)。

二、示例1:基础二分查找(查找目标值的下标)

1. 题目描述

给定升序数组[1, 3, 5, 7, 9, 11, 13, 15, 17, 19],查找目标值 11,找到则返回其下标,找不到则返回 -1。

2. C语言代码(可直接运行)

c
#include <stdio.h>

// 二分查找函数:arr=目标数组,len=数组长度,target=要查找的目标值
int binarySearch(int arr[], int len, int target) {
int left = 0;// 左边界
int right = len - 1;// 右边界

// 循环查找,直到左边界超过右边界
while (left <= right) {
int mid = (left + right) / 2;// 计算中点下标

if (arr[mid] == target) {
return mid;// 找到目标值,返回下标
}
else if (arr[mid] < target) {
left = mid + 1;// 目标在右侧,更新左边界
}
else {
right = mid - 1;// 目标在左侧,更新右边界
}
}

return -1;// 循环结束未找到,返回-1
}

int main() {
int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};// 有序数组
int len = sizeof(arr) / sizeof(arr[0]);// 计算数组长度
int target = 11;// 目标值

int res = binarySearch(arr, len, target);// 调用二分查找函数

// 输出结果
if (res != -1) {
printf("找到数字 %d,下标是 %d\n", target, res);
} else {
printf("未找到目标值 %d\n", target);
}

return 0;
}

3. 运行结果

找到数字 11,下标是 5

4. 代码说明

该代码实现了最基础的二分查找逻辑,严格遵循“折半-比较-缩范围”的核心,适合查找数组中是否存在某个目标值,并返回其具体位置。

三、示例2:二分查找变种(查找第一个 ≥ 目标值的位置)

实际编程中,除了查找“等于”目标值的位置,更常用的是二分查找的变种,例如查找“第一个大于等于目标值的位置”(即 lower_bound),适用于插入排序区间查找等场景。

1. 题目描述

给定升序数组[2, 4, 6, 8, 10, 12],查找第一个大于等于 7 的元素,返回其下标。(预期答案:下标 3,对应元素 8)

2. C语言代码(可直接运行)

c
#include <stdio.h>

// 查找第一个大于等于target的位置:arr=目标数组,len=数组长度,target=目标值
int lowerBound(int arr[], int len, int target) {
int left = 0;// 左边界
int right = len - 1;// 右边界
int ans = len;// 初始化为数组长度(越界),表示未找到符合条件的元素

while (left <= right) {
int mid = (left + right) / 2;// 计算中点下标

if (arr[mid] >= target) {
ans = mid;// 记录当前符合条件的位置,可能是第一个
right = mid - 1;// 继续往左查找,寻找更早(更小下标)的符合条件的位置
} else {
left = mid + 1;// 当前元素小于目标值,去右侧查找
}
}

return ans;// 返回第一个≥target的位置,若返回len则表示所有元素都小于target
}

int main() {
int arr[] = {2, 4, 6, 8, 10, 12};// 有序数组
int len = sizeof(arr) / sizeof(arr[0]);// 计算数组长度
int target = 7;// 目标值

int pos = lowerBound(arr, len, target);// 调用查找函数

// 输出结果
printf("第一个大于等于 %d 的位置下标是:%d\n", target, pos);

return 0;
}

3. 运行结果

第一个大于等于 7 的位置下标是:3

4. 代码说明

该变种的核心的是“记录符合条件的位置,并继续向左缩小范围”,确保找到的是“第一个”符合条件的元素。若数组中所有元素都小于目标值,最终返回数组长度(越界),可用于判断插入位置。

四、核心总结

  • 二分查找的核心:有序数组 + 每次折半缩小范围
  • 时间复杂度:O(log n)(高效的关键,n 为数组长度);
  • 两种常用模板:
  • 基础模板:查找“等于”目标值的下标,找不到返回 -1;
  • 变种模板(lower_bound):查找“第一个 ≥ 目标值”的下标,适用于插入、区间查询等场景。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 21:15:23

golang如何实现WAF Web应用防火墙_golang WAF Web应用防火墙实现详解

Go实现WAF的核心是将过滤逻辑嵌入标准http.Handler链&#xff0c;通过中间件式Handler包装原始handler&#xff0c;在轻量检查&#xff08;如SQL注入关键词、路径遍历&#xff09;后放行&#xff1b;需注意双重编码解码、代理头可信解析、body流控制及白名单优先等关键细节。Go…

作者头像 李华
网站建设 2026/4/16 21:14:29

淘宝NPM镜像证书过期问题全面解析:从报错到多镜像源切换实战

1. 淘宝NPM镜像证书过期问题详解 那天早上我正急着给项目添加新功能&#xff0c;运行npm install后突然蹦出个红色报错&#xff1a;"request to https://registry.npm.taobao.org failed, reason: certificate has expired"。这就像你早上赶着上班发现地铁停运一样让…

作者头像 李华
网站建设 2026/4/16 21:14:24

怎么将VSCode添加到右键菜单

文章目录方法一&#xff1a;注册表编辑法&#xff08;推荐&#xff09;步骤1&#xff1a;创建注册表文件步骤2&#xff1a;修改路径步骤3&#xff1a;保存并运行步骤4&#xff1a;立即生效方法二&#xff1a;手动编辑注册表&#xff08;适合高级用户&#xff09;方法三&#xf…

作者头像 李华
网站建设 2026/4/16 21:13:10

告别模糊:手把手教你用xrandr命令调整VMware中Kylin系统的屏幕分辨率

深度掌握xrandr&#xff1a;VMware中Kylin系统分辨率调优实战指南 在虚拟化环境中运行Linux系统时&#xff0c;分辨率问题常常成为用户体验的第一道门槛。特别是对于国产操作系统Kylin V10在VMware中的使用场景&#xff0c;许多用户发现图形界面(GUI)提供的分辨率选项有限&…

作者头像 李华