当前课程知识点:数据结构(上) > 第二章 向量(上) > (d2)有序向量:二分查找 > 02D2-5 实现
我们来看这个算法的具体实现
主体是个while循环
每一次我们都来判断
当前这个区间是否有效
如果依然是有效的
我们如刚才所言,会取出lo和hi的中点
同样右移一位,等效于除2
接下来,我们来判断
e是否是小于当前这个mi
如果是小于这个点,就要向左侧去深入
就是将hi这个标志挪到mi这个位置上来
从而把我们的关注力挪到左侧这个区间
对称地,如果反过来
e要大于mi这个点
那么对称的操作就是将
lo挪到mi的右侧
这也是为什么用mi+1来更新lo
好,如果既不是这种情况也不是这种情况
那么我们就可以断定
两个数之间,如果谁也不比谁大
那么它们只能是相等
这也就是我们所说的成功的情况
这个时候,我们直接地返回这个数值
所以前两种情况
都会继续地while循环,迭代下去
那么出口是在这
直到最后整个这个区间
缩减到已经非法
这个时候,我们就可以断定
查找是失败的
所以这里我们也是沿用最早的习惯
先简明地返回-1
我们说了,这个实际上还是不够的
稍后,我们再来解决这个问题
那么这里我们也提醒大家
编写程序的一个小的习惯
可以帮助你更好地思考问题并且写出算法
更重要的是,可以让你的代码更加好理解
同时也减少一些不必要的失误
大家可以注意到
我们这里头统一地都用了小于号
为什么我们不写成e大于A[mi]?
固然可以那么写,但是那样写不容易理解
我们这里的这种写法呢,非常好理解
我们建议大家更多地用小于号
而不是大于号
因为小于号的左右的次序
和我们通常所画的这样的一个
从小到大的次序是吻合的
所以这样的解读
既可以认为是e小于mi
也可以认为是e存在于
当前这个分界点mi的左侧
所以我们这样顺着读下来
当然我们就应该深入到前半段
也就是左半段去
相应地呢,我们应该修改右侧的界桩
同样接下来,这个解读也是这样
与其说是mi小于e
不如更直观地说是
我们的目标e
是处于mi这个分界点的右侧
所以我们应该深入到右半段
也就是后半段去继续搜索
相应的动作也就是去修改
左侧的那个界桩
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验