news 2026/4/18 10:49:33

二分搜索算方

作者头像

张小明

前端开发工程师

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/18 5:35:47

【Matlab】MATLAB矩阵点乘运算详解:逐元素相乘案例与加权计算应用

MATLAB矩阵点乘运算详解:逐元素相乘案例与加权计算应用 在MATLAB数值计算中,矩阵点乘(也称为元素级乘法,语法为A.*B)是与矩阵线性乘法(A*B)并列的核心运算,其核心逻辑是“两个同维度矩阵的对应元素逐一相乘”,无矩阵线性乘法的行列匹配约束,却兼具灵活的元素级操作特…

作者头像 李华
网站建设 2026/4/18 7:02:12

【个人成长】樊登访谈:创业、读书与成长的底层逻辑

樊登访谈&#xff1a;创业、读书与成长的底层逻辑 一、创业初期&#xff1a;反脆弱的生存智慧 1. 艰难但理性的起步 刚到北京时&#xff0c;央视的工资很不稳定——有节目时工资高,没节目时就低。但我是一个反脆弱性比较强的人&#xff0c;会考虑风险考虑得比较多。我觉得万…

作者头像 李华
网站建设 2026/4/18 0:28:39

基于php技术的广告公司网站方案设计与实现 开题报告

目录 研究背景与意义技术选型分析核心功能模块设计创新点与难点预期成果进度计划 项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 研究背景与意义 广告公司网站作为品牌展示与业务拓展的核心平台&#xf…

作者头像 李华