| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【C语言】二分查找 -> 正文阅读 |
|
[数据结构与算法]【C语言】二分查找 |
一. 二分查找基本思路
因为二分查找每次查找都可以剔除一半的查找范围,所以相比顺序查找每次一个一个元素查找,查找效率提高了很多。 二分查找需要两个必要条件: 1.数组元素必须有序 2.查找的数值不能多个,只能一个 二. 详细图解例如:给定一个有序数组 nums = {1,2,4,5,7,8,11,15} 中,求数字7所在数组中的下标 二分查找过程:?(1)定义两个指针 left 和 right ;left 指向首元素的下标,right 指向最后一个元素的下标。 traget 为目标值。即: ?(2)求中间元素的值mid,即:mid = left + (right -?left) / 2 得到中间下标 通过中间下标可以访问到中间元素 nusm[mid] 。即: 问题:求中间值为什么不用 mid = (left + right) / 2 呢? 原因:如果是两个较大的值,相加超过了 int 取值范围(2147483647)就会导致溢出 ?(3)使用中间值 nums[mid] 和目标值 target 对比,此时 nums[mid] < target 就证明 nums[mid] 左边的值 和 nums[mid]的值都不需要继续对比了。然后将 left 指针移动到 mid+1 的位置,查找范围就是 [mid+1,right] 。即: ?(4)继续对比,发现 nums[mid] > target。证明 nums[mid] 的值?和 nums[mid] 右边的值都不需要对比了。就让 right 指针移动到 mid-1 的位置。即: (5)现在 nums[mid] 和?target 相等,然后返回 mid ,查找结束 下面来看一道经典的二分查找例题,加深理解 三. 例题题目:
示例1:
示例2:
1. 第一步
2.第二步
3.第三步
问题: 如果我们查找的值是小于中间元素的时候呢? 回答:当 目标值?< 中间元素?时,就代表目标值在中间元素的左半部分,右指针就需要移动,也就是right = mid - 1,left不需要移动,此时查找范围为:[left,mid-1]。 大于和小于的情况都判断了,还有相等的情况,目标值 ==?中间元素?时,就意味着找到该元素了,直接返回该下标即可。代码如下:
4.第四步
注意: 1.在查找元素时 left 和 right下标会越来越近甚至指向同一个下标,过程中 left 始终在 right 的左边(即:left <= right)。 2.如果一直找不到那个元素,两个下标必然会相互交错(即: left > right),这时循环结束。所以循环条件就是:while(left <= right) 最终代码:
运行结果: 5.总结?二分查找最重要的两个点,就是循环条件和后续的区间赋值问题 关于二分查找的讲解到这里就结束了,如果有什么不对的地方欢迎在评论区指正,谢谢支持~ |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 23:02:14- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |