C# 二分查找:从原理到实现(新学者思考)
1. 什么是二分查找二分查找Binary Search是一种在有序数组中查找特定元素的高效算法。它的核心思想是“分而治之”每次将搜索范围缩小一半直到找到目标值或范围为空。时间复杂度为 O(log n)比线性查找的 O(n) 快得多尤其适合大规模数据。2. 算法原理二分查找的基本步骤如下设定左右边界 left 和 right初始分别为数组的第一个和最后一个索引。计算中间索引 mid left (right - left) / 2这样可以防止大数相加时溢出。将中间元素与目标值比较若相等返回 mid若中间元素小于目标值说明目标在右半部分将 left 更新为 mid 1若中间元素大于目标值说明目标在左半部分将 right 更新为 mid - 1。重复步骤 2-3直到 left 大于 right表示未找到目标值。3. 边界条件与常见坑点在实际编码中二分查找的边界处理非常容易出错重点关注循环条件使用 while (left right)当 left 和 right 相等时仍需判断该位置。中间索引计算优先使用 left (right - left) / 2避免 (left right) / 2 的溢出风险。左右边界更新left mid 1 或 right mid - 1否则可能陷入死循环。返回值未找到时通常返回 -1 或插入位置的按位取反值。4. C# 标准实现迭代版下面给出一个经典的迭代二分查找方法适用于 int 数组/// summary /// 在有序整数数组中执行二分查找返回目标值的索引未找到返回 -1。 /// /summary public static int BinarySearch(int[] arr, int target) { if (arr null || arr.Length 0) return -1; int left 0; int right arr.Length - 1; 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; // 未找到 }5. C# 递归实现二分查找也可以写成递归形式逻辑更直观但需要注意递归深度和栈空间消耗/// summary /// 二分查找的递归版本返回目标索引未找到返回 -1。 /// /summary public static int BinarySearchRecursive(int[] arr, int target) { return BinarySearchRecursive(arr, target, 0, arr.Length - 1); } private static int BinarySearchRecursive(int[] arr, int target, int left, int right) { if (left right) return -1; int mid left (right - left) / 2; if (arr[mid] target) return mid; else if (arr[mid] target) return BinarySearchRecursive(arr, target, mid 1, right); else return BinarySearchRecursive(arr, target, left, mid - 1); }6. 查找第一个或最后一个目标值变种如果数组中有重复元素可能需要找到第一次出现的位置或最后一次出现的位置。这是二分查找的常见变种在 C# 中也很容易实现/// summary /// 查找目标值在数组中第一次出现的索引。 /// /summary public static int FindFirst(int[] arr, int target) { int left 0, right arr.Length - 1; int result -1; while (left right) { int mid left (right - left) / 2; if (arr[mid] target) { result mid; // 记录当前找到的位置 right mid - 1; // 继续向左搜索更早的匹配 } else if (arr[mid] target) left mid 1; else right mid - 1; } return result; } /// summary /// 查找目标值在数组中最后一次出现的索引。 /// /summary public static int FindLast(int[] arr, int target) { int left 0, right arr.Length - 1; int result -1; while (left right) { int mid left (right - left) / 2; if (arr[mid] target) { result mid; // 记录当前找到的位置 left mid 1; // 继续向右搜索更晚的匹配 } else if (arr[mid] target) left mid 1; else right mid - 1; } return result; }7. 使用 C# 内置的 Array.BinarySearch.NET 框架本身就提供了二分查找方法Array.BinarySearch它返回的是找到的索引如果未找到则返回一个负数其按位取反后就是目标应插入的位置。使用起来非常方便int[] sortedArray { 1, 3, 5, 7, 9 }; int index Array.BinarySearch(sortedArray, 5); // 返回 2 int notFound Array.BinarySearch(sortedArray, 4); // 返回负数 if (notFound 0) { // ~notFound 就是 4 应该插入的位置以保持数组有序 int insertPos ~notFound; Console.WriteLine($4 应插入在索引 {insertPos} 处); }8. 常见面试题与应用场景在旋转有序数组中查找目标值LeetCode 33。寻找峰值元素LeetCode 162。计算平方根LeetCode 69。搜索二维矩阵LeetCode 74。在有序数据集合中快速定位、范围查询等。这些题目本质上都是二分查找思想的延伸掌握了基础实现后可以灵活运用边界调整来适应不同需求。9. 总结实现时牢牢记住三点有序数组、正确的中间点计算和合适的边界收缩。平时也可以直接使用Array.BinarySearch减少重复造轮子但理解其背后的原理才能让你在复杂问题中游刃有余。新手强烈推荐看b站up蓝不过海的演示视频

相关新闻

Qwen-Audio-3.0-TTS:16种语言20种方言的多语言语音合成技术解析

Qwen-Audio-3.0-TTS:16种语言20种方言的多语言语音合成技术解析

如果你正在为多语言语音合成项目发愁,或者对当前TTS模型的语言覆盖能力不满意,那么通义最新发布的Qwen-Audio-3.0-TTS绝对值得你深入了解。这个模型不仅支持16种语言和20种方言,更重要的是,它在语音质量、情感表现和部署便利性上都…

2026/10/9 2:44:05 阅读更多 →
鸿蒙三方库 | harmony-utils之LocationUtil位置获取与订阅详解

鸿蒙三方库 | harmony-utils之LocationUtil位置获取与订阅详解

前言 位置服务是LBS应用的核心能力,如地图导航、附近搜索、运动追踪等。pura/harmony-utils 的 LocationUtil 封装了位置获取和订阅方法,帮助开发者轻松实现定位功能。本文将从API说明、代码实战、进阶用法、常见问题等多个维度进行全面讲解,…

2026/10/6 0:00:34 阅读更多 →
二维深度卷积网络在轴承故障诊断中的实践与优化

二维深度卷积网络在轴承故障诊断中的实践与优化

1. 二维深度卷积网络在轴承故障诊断中的应用概述轴承作为旋转机械的核心部件,其运行状态直接影响设备整体可靠性。传统基于信号处理的诊断方法(如FFT分析、小波变换)在复杂工况下存在特征提取困难、泛化能力不足等问题。二维深度卷积网络&…

2026/10/12 17:14:49 阅读更多 →

最新新闻

适配器模式实战:类适配器与对象适配器如何选型

适配器模式实战:类适配器与对象适配器如何选型

做后端开发的这些年,我几乎每年都会遇到同一个尴尬:手里维护的还是那套吭哧吭哧跑了好几年的老类,可新需求、新SDK、新网关全都只认另一套接口格式。改老代码怕影响线上,推倒重写工期又不够,这时候最实用的解法就是加一…

2026/10/16 12:21:30 阅读更多 →
是谁给外国客户发邮件基本邮件礼仪都不懂?

是谁给外国客户发邮件基本邮件礼仪都不懂?

今日份邮件拆解:从催附件到埋钩子,让客户主动找你的实战话术来啦!提醒看附件:得体不催促,客户秒点随时联系:给足安全感,降低回复门槛表达感谢:真诚不敷衍,加深好感期待合…

2026/10/16 12:21:30 阅读更多 →
宽海智能:用标准化把非标服务做成产品,存量立库改造的商业模式思考

宽海智能:用标准化把非标服务做成产品,存量立库改造的商业模式思考

作者:宽海智能——存量立库全科医生WMS|WCS|数字孪生|PLC升级改造|技术盘活|新增需求|维护保养长沙|佛山|苏州|成都|天津引言每一个行业从野蛮生长…

2026/10/16 12:21:30 阅读更多 →
无人驾驶控制算法从入门到实践:横向与纵向控制全解析

无人驾驶控制算法从入门到实践:横向与纵向控制全解析

做无人驾驶算法这条路上,很多人是从感知入门的,跑通了目标检测、分割、跟踪,觉得离“让车自己走”还很近。但其实真正让车动起来的关键一步,是控制。感知负责看见世界,定位负责知道我在哪,规划负责决定往哪…

2026/10/16 12:21:30 阅读更多 →
Terraform 纳管 AI 网关:把 LiteLLM 配置做成基础设施即代码

Terraform 纳管 AI 网关:把 LiteLLM 配置做成基础设施即代码

Terraform 纳管 AI 网关:把 LiteLLM 配置做成基础设施即代码 【免费下载链接】litellm The fastest, litest AI Gateway. Rust core with Python SDK. Call 100 LLM APIs in OpenAI (or native) format with cost tracking, guardrails, load balancing, and loggin…

2026/10/16 12:21:29 阅读更多 →
UVM Sequencer 深度解析:FIFO 深度、req/rsp 应答模型与高频面试坑

UVM Sequencer 深度解析:FIFO 深度、req/rsp 应答模型与高频面试坑

一、Sequencer 内部FIFO深度 1. 两个核心FIFO(很多人混淆!) uvm_sequencer 内部维护两套FIFO,不是一个: request FIFO(req_fifo):存放sequence发过来的transaction(req&a…

2026/10/16 12:20:29 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →