news 2026/10/15 17:17:24

二分搜索算方

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二分搜索算方

二分搜索是一种在排序或单调搜索空间上运行的搜索算法,通过反复将其分割成两半,以在对数时间O(log N)内找到目标值或最优答案。

在数据结构中应用二分搜索算法的条件
应用二分搜索算法:

数据结构必须被排序。
访问数据结构的任何元素应耗时为常数。
二叉搜索算法
以下是二分搜索的逐步算法:

通过找到中间的索引“mid”,将搜索空间分成两半。
比较搜索空间的中间元素与键。
如果 密钥位于中间元素,则进程终止。
如果中间元素找不到关键,选择下一个搜索空间的一半。
-> 如果键比中间元素小,则下一次搜索使用左侧。
-> 如果键大于中间元素,则下一次搜索使用右侧。
该过程持续进行,直到找到关键密钥或整个搜索空间耗尽。
二分搜索算法是如何工作的?
为了理解二分搜索的工作原理,请考虑以下示例:

考虑数组 arr[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91},目标 = 23。


如何实现二分搜索?
二叉搜索算法可以通过以下两种方式实现

迭代二分搜索算法
递归二分搜索算法
迭代算法:时间 O(log n) 和空间 O(1)
这里我们使用while循环继续比较密钥并将搜索空间分成两半的过程。

重定向图标

class GFG { static int binarySearch(int arr[], int x) { int low = 0, high = arr.length - 1; while (low <= high) { int mid = low + (high - low) / 2; // Check if x is present at mid if (arr[mid] == x) return mid; // If x greater, ignore left half if (arr[mid] < x) low = mid + 1; // If x is smaller, ignore right half else high = mid - 1; } // If we reach here, then element was // not present return -1; } public static void main(String args[]) { int arr[] = { 2, 3, 4, 10, 40 }; int x = 10; int result = binarySearch(arr, x); if (result == -1) System.out.println( "Element is not present in array"); else System.out.println("Element is present at " + "index " + result); } }

输出
Element is present at index 3
递归算法:时间 O(log n) 和空间 O(log n)
创建一个递归函数,并将搜索空间的中间值与键进行比较。根据结果,要么返回找到密钥的索引,要么调用下一个搜索空间的递归函数。

class GFG { // A recursive binary search function. It returns // location of x in given array arr[low..high] is present, // otherwise -1 static int binarySearch(int arr[], int low, int high, int x) { if (high >= low) { int mid = low + (high - low) / 2; // If the element is present at the // middle itself if (arr[mid] == x) return mid; // If element is smaller than mid, then // it can only be present in left subarray if (arr[mid] > x) return binarySearch(arr, low, mid - 1, x); // Else the element can only be present // in right subarray return binarySearch(arr, mid + 1, high, x); } // We reach here when element is not present // in array return -1; } public static void main(String args[]) { int arr[] = { 2, 3, 4, 10, 40 }; int n = arr.length; int x = 10; int result = binarySearch(arr, 0, n - 1, x); if (result == -1) System.out.println( "Element is not present in array"); else System.out.println( "Element is present at index " + result); } }

输出
Element is present at index 3
复杂性分析
时间复杂度:
-> 最佳情况:O(1)
-> 平均情况:O(对数n)
->最坏情况:O(log n)
辅助空间:O(1),如果考虑递归调用栈,则辅助空间为 O(log N)。

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

【Matlab】MATLAB矩阵乘法运算详解:从行列匹配案例到线性变换计算应用

MATLAB矩阵乘法运算详解:从行列匹配案例到线性变换计算应用 在MATLAB数值计算体系中,矩阵乘法(也称为矩阵的线性乘法)是区别于元素级乘法的核心线性代数运算,核心规则是“前矩阵列数等于后矩阵行数”,运算逻辑遵循“行乘列求和”,是实现线性变换、线性方程组求解、数据…

作者头像 李华
网站建设 2026/10/15 3:08:04

注册表单必填项测试全解析:策略、场景与最佳实践

一、必填项测试的核心价值 在用户体验与数据完整性的交汇点&#xff0c;注册表单必填项是用户转化的第一道闸门。对测试人员而言&#xff0c;这不仅关乎字段验证逻辑&#xff0c;更涉及防呆机制设计、错误恢复能力及合规性保障&#xff08;如GDPR&#xff09;。漏测一个必填项…

作者头像 李华
网站建设 2026/10/14 11:33:29

基于Spring Boot的旅游网站系统毕业论文+PPT(附源代码+演示视频)

文章目录 一、项目简介1.1 运行视频1.2 &#x1f680; 项目技术栈1.3 ✅ 环境要求说明1.4 包含的文件列表 前台运行截图后台运行截图项目部署源码下载 一、项目简介 项目基于SpringBoot框架&#xff0c;前后端分离架构&#xff0c;后端为SpringBoot前端Vue。本文旨在开发一个基…

作者头像 李华
网站建设 2026/10/15 3:01:58

图像加载手动测试流程详解

在当今数字化时代&#xff0c;图像加载功能广泛应用于Web和移动应用&#xff08;如图片画廊、电商平台和社交媒体&#xff09;&#xff0c;其性能与可靠性直接影响用户体验。手动测试作为自动化测试的重要补充&#xff0c;能有效捕捉边界情况和用户交互问题。本文针对软件测试从…

作者头像 李华
网站建设 2026/10/15 0:38:14

深度剖析高级移动端开发工程师的核心能力图谱与技术实践路径 —— 以千里马国际猎聘招聘要求为例

深圳千里马国际猎聘科技集团有限公司 高级移动端开发工程师 职位信息 【工作职责】 1. 负责 iOS 和 Android 应用的整体架构设计与核心功能开发。 2. 独立承担复杂业务模块开发,推动跨平台架构优化与性能提升。 3. 优化双平台工程架构与代码质量,提升系统的稳定性与扩展性。 …

作者头像 李华
网站建设 2026/10/14 15:47:13

『NAS』用SSH的方式连上NAS

点赞 关注 收藏 学会了 整理了一个NAS小专栏&#xff0c;有兴趣的工友可以关注一下 &#x1f449; 《NAS邪修》 有些非技术出身的工友入手NAS后&#xff0c;只用来存照片、存电影&#xff0c;却不知道开启SSH后&#xff0c;NAS能变得更强大、更好用。其实SSH一点都不复杂&am…

作者头像 李华