news 2026/4/23 15:50:26

二分搜索算方

作者头像

张小明

前端开发工程师

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/4/23 14:15:57

快速排序算法java实现

快速排序是一种基于分治的排序算法&#xff0c;它选择一个元素作为枢轴&#xff0c;并通过将该枢轴置于排序后的数组中正确位置来划分。该算法主要包含三个步骤&#xff1a;选择枢轴&#xff1a;从数组中选择一个元素作为枢轴。枢轴的选择可以有所不同&#xff08;例如&#xf…

作者头像 李华
网站建设 2026/4/23 14:12:47

隐私政策链接的关键测试维度与落地方法论

一、测试背景与法规红线 随着《个人信息保护法》第17条强制要求&#xff0c;隐私政策链接已成为互联网产品合规生命线。测试人员需重点关注&#xff1a; 显性存在性&#xff1a;主界面footer/用户注册流程的强制露出 动态有效性&#xff1a;SPA应用路由跳转、灰度发布场景的链…

作者头像 李华
网站建设 2026/4/23 9:30:25

杰理之可以根据回调函数对IO口进行判断【篇】

static void port_wakeup_callback(u8 index, u8 gpio) { log_info(“%s:%d,%d”,FUNCTION,index,gpio); switch (index) {#if (TCFG_TEST_BOX_ENABLE || TCFG_CHARGESTORE_ENABLE || TCFG_ANC_BOX_ENABLE) case 2: extern void chargestore_ldo5v_fall_deal(void); chargestor…

作者头像 李华
网站建设 2026/4/23 10:56:34

杰理之IIS初步故障现象定位【篇】

◦ 是 “完全无信号”&#xff08;如喇叭无声、录音无数据&#xff09;&#xff0c;还是 “信号异常”&#xff08;如杂音、卡顿、失真&#xff09;&#xff1f; ◦ 是单向故障&#xff08;仅输出 / 仅输入异常&#xff09;&#xff0c;还是双向故障&#xff08;输出和输入均异…

作者头像 李华
网站建设 2026/4/23 10:51:29

Matplotlib科研级图表导出与样式标准化实战

在学术论文、期刊投稿与正式科研报告中&#xff0c;图表的导出格式、分辨率、样式规范&#xff0c;是满足发表要求的核心环节。普通的可视化展示仅需满足屏幕查看需求&#xff0c;而科研级可视化需要兼顾期刊格式约束、印刷清晰度、排版一致性。本文围绕 Matplotlib 科研图表导…

作者头像 李华
网站建设 2026/4/23 10:53:47

temperature=0的意义:确保输出稳定可复现

temperature0的意义&#xff1a;确保输出稳定可复现 在大模型微调与推理实践中&#xff0c;一个看似微小的参数——temperature0&#xff0c;却常常被新手忽略&#xff0c;甚至误认为“只是让输出更‘死板’”。但事实恰恰相反&#xff1a;它不是限制创造力的枷锁&#xff0c;…

作者头像 李华