news 2026/5/30 20:13:50

二分查找:高效搜索算法详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二分查找:高效搜索算法详解

二分查找的定义:

高效的搜索算法,核心每次搜索将目标值范围缩小一半,逐近逼近目标值,算法的时间复杂度缩小到O(logn)也叫做折半查找算法

用法:

必须在有序的数组有序的区间内,我们想要找到一个目标值targe,首先查询中间的下标,如果小于目标值:升序就向上对半找,找到大于或者等于目标值,降序反之,大于也是同一个算法。

例如我们的目标值是4,首先第一个判定的是mid值7,然后7>4,因为降序就查找left——mid/2的值一般为向下取整(left+(mid-left)/2),为3<4,然后在对半,找到4。

运用:

有序数组中的元素查找:eg在一个升序的数组中查找目标值是否存在,找到一个目标值的下标或者判断插入位置。

查找边界问题:

  • 找到数组中第一个大于等于目标值的位置。

  • 找到数组中最后一个小于等于目标值的位置。

  • 处理重复元素时,确定目标值的起始位置和结束位置

动态问题

在动态数据结构中,二分查找可以结合其他算法使用,例如:

  • 在动态更新的有序数组中快速查找目标值。

  • 数据库索引的实现中,二分查找用于加速检索。

注意事项:

  • 数组必须有序:二分查找只能在有序数组或区间中使用。

  • 边界条件:需要正确处理左右边界,避免死循环。

  • 单调性:问题的解需要具有单调性,才能通过二分查找优化。

核心函数:

首先我们要确定好我们的返回值,因为要查找下标也好查找targe也好,是一个整形int(当然你也可以为指针double嘛根据自己的需求的)我们这里的话函数名就设置为binarySearch。参数就是我们的数组arr[],len,targe//用len,来传入我们的最后一位元素的下标嘛len-1,最右边,最左就是0。

// 二分查找:有序升序数组,返回目标值下标,未找到返回-1 int binarySearch(int arr[], int len, int target) { int left = 0; // 左边界 int right = len - 1; // 右边界(闭区间 [left, right]) while (left <= right) { // 循环条件:闭区间不为空 int mid = left + (right - left) / 2; // 计算中间下标(避免溢出) if (arr[mid] == target) { return mid; // 找到目标,返回下标 } else if (arr[mid] < target) { left = mid + 1; // 目标在右半区,左边界右移 } else { right = mid - 1; // 目标在左半区,右边界左移 } } return -1; // 未找到 }

while当中我们的判断条件就是我们的判断区间不能为空,中级的mid算法跟我上面的一样的,中该中间的判断就是,是目标值,在左边,在右边(只为缩小范围),有人或许会问如果有相同的targe怎么办呢,这个我们只需要,找到目标值之后,接着偏移(这个一般来说是用在找到第一个下标的目标值),下面就是我们的主函数测试代码了

主函数调试测试:

int main() { int arr[] = {1, 3, 5, 7, 9, 11}; int len = sizeof(arr) / sizeof(arr[0]); int target = 7; int index = binarySearch(arr, len, target); if (index != -1) { printf("目标值 %d 的下标:%d\n", target, index); } else { printf("未找到目标值\n"); } return 0; }

我们初始化一个数组,然后定义一个目标值,然后寻找,这个可以联合我们上周学习的,输入不定长整数,然后在输入一个目标值然后查询,输出下标。

非常感谢大家的观看和支持,这周的话我会学习和做一个小项目链表的通讯录管理(可能要打稿)

这个里面就包含我们前面所学的,进阶指针,堆的内存,和栈的内存,链表,我们的二叉树,这个做完之后,我回去接着发布一些学习内容,关于linux和io文件的一些基础和学习,希望大家能喜欢。相互学习QQ群号:238038904

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 19:30:10

libgit2实战指南:从源码编译到项目集成的完整解决方案

libgit2实战指南&#xff1a;从源码编译到项目集成的完整解决方案 【免费下载链接】libgit2 A cross-platform, linkable library implementation of Git that you can use in your application. 项目地址: https://gitcode.com/gh_mirrors/li/libgit2 libgit2是一个跨平…

作者头像 李华
网站建设 2026/5/28 19:19:21

高效办公利器:Xmind 2025 下载安装步骤跨端协同与项目管理实践

简介 Xmind 2025 是 XMind 全新推出的思维导图工具&#xff0c;核心升级 AI 创作、项目管理和跨平台协作三大能力&#xff0c;打通从灵感发散到任务落地的全流程&#xff0c;能满足个人学习、职场办公、团队协作等多种需求。 一、核心功能亮点&#xff08;效率与落地双升级&a…

作者头像 李华
网站建设 2026/5/30 18:34:00

后台开发看过来:这次带你一举拿下网络IO模型

前言IO 是计算机体系中重要的一部分 。不同的 IO 设备有着不同的特点&#xff1a;数据率不一样、传送单位不一样&#xff0c;数据表示不一样&#xff0c;等等。所以&#xff0c;很难实现一种统一的输入输出方法。IO 有两种操作&#xff0c;同步 IO 和异步 IO。同步 IO 指的是&a…

作者头像 李华
网站建设 2026/5/28 21:39:52

数据结构算法篇洗牌算法(特别有意思的算法)

一、算法结构1.我们需要Card类来定义卡牌卡牌需要一个rank&#xff08;牌面数字&#xff09;&#xff0c;和一个suit&#xff08;花色&#xff09;注意要记得写一个toString方法public int rank;//牌面数字public String suit;//花色public Card(int rank, String suit) {this.…

作者头像 李华
网站建设 2026/5/30 19:24:48

论文生成源码排名:9大平台+开源开发工具

论文生成源码排名&#xff1a;9大平台开源开发工具 核心工具对比速览 工具名称 核心功能 处理时间 适配检测系统 特色优势 aibiye 论文降重与AIGC优化 15-30分钟 知网/维普/万方 语义级改写技术&#xff0c;保留学术逻辑 aicheck AIGC检测与降重 20分钟 知网/格子…

作者头像 李华
网站建设 2026/5/28 23:43:46

打造个人专属媒体王国:Jellyfin跨平台一键部署全攻略

还在为手机、电脑、电视上的媒体文件分散管理而头疼吗&#xff1f;想要随时随地欣赏自己的电影收藏却苦于找不到合适的解决方案&#xff1f;今天我要向你推荐一款完全免费、功能强大的个人媒体服务器软件——Jellyfin&#xff0c;让你轻松拥有属于自己的媒体王国&#xff01; 【…

作者头像 李华