当前课程知识点:程序设计基础 > 第四章 筛法与查找 > 4.4 折半查找 > 4.4.2 折半查找思路
有了刚才的思路
让我们再回到扑克查找的问题
如果已知我手里这些扑克是有顺序的
是不是可以用类似翻书的这种方式
找到黑桃Q呢
那什么叫类似翻书
我们可以先随便挑一张看一下
如果是黑桃Q
恰好就是黑桃Q
那说明我们找到了
如果手里挑到的这张牌比黑桃Q要大
那么要么黑桃Q不存在在我手中
要么就一定在挑到的这张的左侧
因为我手里的牌是有顺序的
那么反过来
如果我挑到的这张牌比黑桃Q要小
那么同样
要么黑桃Q是不存在在我手中的
要么一定在我右侧
那么下面我只需要在右侧继续
进行查找就可以了
整理一下我们刚才的思路
其中比较关键的是要随便的
挑一张牌来做一个比较
那选哪张来做比较比较好呢
如果我们每次总是去挑最左边的一张
进行比较
那其实大家想一下这个过程
最左边正好是黑桃Q 就找到了
如果不是呢 去跟它去比
要么在左边 要么在右边
因为右边牌很多
左边已经没有牌了
那么很大的可能性就在右边
最后导致这个查找的方式
就和线性查找是差别不大的
同样的如果我每次都选最右边的一张
也是和线性查找差别不大
所以大家可以直观的想象
我应该是找一个让左右更公平
出现在左边和出现在右边
的概率均等的一张
所以我们一般选择最中间的
一张牌进行比较
比如我们一般把这种
查找的方式称为折半查找
每一次会刨掉 做一个判断
然后刨掉一半的区间
在剩下一半的区间里继续进行查找
这里我为了容易理解做一个动画
如果在一个数组当中是什么样的情况
在一个cards的数组当中
每次我应该去找最中间的那一项
也就是middle所在的这一项
然后把它分成左边和右边
然后拿middle这一项和目标
target去比较
这个程序大概会写成什么样呢
就下面这种如果判断一下
它是相等的 就找到了
如果目标这张牌比中间这张牌要大
那么说明什么
说明这张目标的牌应该在我的右边
那我就继续更新一下范围
从右边找 反过来
如果目标这张牌比中间这种牌要小
那我就应该在左边找
那什么叫 比如说
我现在选到了在右边这一个范围
那我可以继续进行折半的操作
再选右边正中间的这张牌做比较
然后反过来 如果比它小在左边搜索
也可以继续在左边的范围当中的
中间那张牌继续进行比较
这样一直做一直做
那显然应该是一个循环的过程
这个循环要到什么时候才能结束呢
那么要么是找到了所对应的牌
找到了这张黑桃Q
要么我的查找范围已经
一再一再的缩小
缩小到这个范围里已经
没有牌可以进行比较了
那么说明真的没有找到这张黑桃Q
所以整理一下这个思路
大概写成这样一个形式化的思路
首先我们要初始化一个查找范围
假设我现在没有找到黑桃Q
然后如果范围内一直有牌
就要一直循环的做一件事
就是选取中间这张牌
跟黑桃Q进行比较
如果中间这张牌就是黑桃Q
那么我们就记下它的位置
说明找到了 停止查找
否则要对它进行一个
跟黑桃Q要么大要么小的比较
如果中间这张牌比黑桃Q要大
那么更新一下范围
说明我们应该在左侧继续进行查找
如果中间这张牌比黑桃Q要小
我们同样更新一下范围
在中间这张牌的右侧进行查找
下一节我们就把这样一个思路翻译成程序
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测