当前课程知识点:程序设计基础 >  第四章 筛法与查找 >  4.4 折半查找 >  4.4.2 折半查找思路

返回《程序设计基础》慕课在线视频课程列表

4.4.2 折半查找思路在线视频

4.4.2 折半查找思路

下一节:4.4.3 折半查找代码翻译

返回《程序设计基础》慕课在线视频列表

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.1.1 什么是程序?什么是语言?

--1.1.2 什么是程序设计?

--1.1.3 计算机发展史

-1.2 买菜问题

--1.2.1 问题描述

--1.2.2 程序的基本结构

-1.3 数学运算

--1.3.1 数学运算符

--1.3.2 数学函数

-1.4 补充说明

--1.4.1 编程环境的下载与安装

--1.4.2 程序基本结构中的含义

--1.4.3 格式与风格

-1.5 总结

--1.5 总结

-程设论道

--程设论道

-师生问答

--师生问答一:怎样学好程序设计

--师生问答二:语言选择

--师生问答三:关于函数

-第一章 编程初步--语法自测

第二章 变量与代数思维

-2.1 关于超级计算器的几点思考

--2.1.1 关于超级计算器的几点思考

-2.2 电子秤模拟 — 背景介绍及需求分析

--2.2.1 电子秤模拟 — 背景介绍及需求分析

-2.3 电子秤模拟 — 代码实现

--2.3.1 电子秤模拟 — 代码实现

-2.4 变量定义与变量类型

--2.4.1 变量定义与变量类型

-2.5 猜数游戏与数据表示

--2.5.1 猜数游戏与数据表示

-2.6 关于变量的讨论

--2.6.1 变量的初始值

--2.6.2 变量类型

--2.6.3 变量内存单元地址

--2.6.4 存“变量地址”的变量——指针

--2.6.5 指针的 读/写 操作

--2.6.6 指针的 加/减 操作

--公告

-2.7 变量体现的计算思维

--2.7.1 变量体现的计算思维

-程设论道

--程设论道

-师生问答

--师生问答

-第二章 变量与代数思维--语法自测

第三章 逻辑推理与枚举解题

-3.1 谁做的好事——语义表示

--3.1.1 谁做的好事——语义表示

-3.2 谁做的好事——真假检查

--3.2.1 谁做的好事——真假检查

-3.3 谁做的好事——循环枚举

--3.3.1 谁做的好事——循环枚举

-3.4 谁是嫌疑犯——多重循环枚举

--3.4.1 谁是嫌疑犯——多重循环枚举

-3.5 谁是嫌疑犯——破案线索表示

--3.5.1 谁是嫌疑犯——破案线索表示

-3.6 谁是嫌疑犯——用二进制枚举

--3.6.1 谁是嫌疑犯——用二进制枚举

-程设论道

--程设论道一

--程设论道二

--程设论道三

-师生问答

--师生问答一:字符与ASCII码表

--师生问答二:其他循环语句、运算符优先级与变量作用域

-第三章 逻辑推理与枚举解题--语法自测

第四章 筛法与查找

-4.1 插花游戏

--4.1.1 问题提出(求素数)

--4.1.2 函数初探

--4.1.3 运行演示

-4.2 筛法

--4.2.1 筛法思路

--4.2.2 数组的定义

--4.2.3 代码翻译

--4.2.4 运行演示

--4.2.5 小朋友数人数

--4.2.6 运行演示

--4.2.7 韩信点兵

-4.3 线性查找

--4.3.1 扑克查找问题

--4.3.2 扑克查找问题代码翻译

--4.3.3 最小值问题

--4.3.4 最小值问题代码翻译

-4.4 折半查找

--4.4.1 提问

--4.4.2 折半查找思路

--4.4.3 折半查找代码翻译

--4.4.4 折半查找运行演示

-4.5 排序问题

--4.5.1 插入排序

--4.5.2 选择排序

--4.5.3 函数写法

--4.5.4 运行演示

-4.6 总结

--4.6.1 总结

-程设论道

--程设论道一:数组与编码思维

--程设论道二:筛法

-师生问答

--师生问答一:函数与面向过程编程

--师生问答二:数组的下标越界

-第四章 筛法与查找--语法自测

第五章 分治思想与递归

-5.1 阶乘

--5.1.1 阶乘问题

--5.1.2 递归解法

--5.1.3 递归小结

-5.2 排序

--5.2.1 归并排序——总体思路

--5.2.2 归并排序——思路分解

--5.2.3 归并排序——代码解说

--5.2.4 快速排序——总体思路

--5.2.5 快速排序——代码解说

--5.2.6 排序总结

-5.3 矩阵填充

--5.3.1 矩阵填充问题

--5.3.2 代码解说

-5.4 分书与八皇后

--5.4.1 问题描述

--5.4.2 问题分析——共性

--5.4.3 问题分析——区别

--5.4.4 解题准备——二维数组

--5.4.5 解题准备——递归设计

--5.4.6 代码解说——分书问题

--5.4.7 代码解说——八皇后问题

-5.5 青蛙过河

--5.5.1 问题描述

--5.5.2 问题分析——简单情况

--5.5.3 问题分析——复杂情况

--5.5.4 问题分析——一般情况

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答一

--师生问答二

-第五章 分治思想与递归--语法自测

第六章 递推与动态规划

-6.1 兔子数列问题

--6.1.1 问题描述

--6.1.2 按大小兔子分别递推

--6.1.3 按总数递推

--6.1.4 不用数组递推

-6.2 分鱼问题

--6.2.1 问题描述

--6.2.2 从A到E递推

--6.2.3 从E到A递推

-6.3 橱窗的插花问题

--6.3.1 问题描述

--6.3.2 题意理解与分析

--6.3.3 用枚举思想解题

--6.3.4 采用递推的优化算法

--6.3.5.1 采用动态规划算法—优化分析

--6.3.5.2 采用动态规划算法—递推代码

--6.3.5.3 采用动态规划算法—计算过程

--6.3.5.4 采用动态规划算法—输出方案

--6.3.6 动态规划总结

-6.4 最长公共子序列问题

--6.4.1 问题描述与理解

--6.4.2 问题分析

--6.4.3.1 动态规划解题(1)

--6.4.3.2 动态规划解题(2)

--6.4.3.3 动态规划代码

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答

-第六章 递推与动态规划--语法自测

第七章 文本数据处理

-7.1 统计记录总数

--7.1.1 问题分析

--7.1.2 读文件操作

-7.2 统计活跃用户数

--7.2.1 问题分析

--7.2.2 字符串

--7.2.3 程序翻译与演示

-7.3 统计在线时长

--7.3.1 问题分析

--7.3.2 结构

--7.3.3 程序翻译与演示

--7.3.4 写文件操作

-7.4 总结

--7.4.1 总结

-程设论道

--程设论道

-师生问答

--师生问答

-第七章 文本数据处理--语法自测

第八章 非文本数据处理

-8.1 将数据组织成链表

--8.1.1 链表的基本概念

--8.1.2 代码讲解

--8.1.3 链表遍历与释放

-8.2 提高链表访问效率 —— 哈希链表

--8.2.1 简单的哈希算法

--8.2.2 算法实现

-8.3 以二进制文件存储链表

--8.3.1 二进制文件的操作方法

--8.3.2 代码讲解

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答

-第八章 非文本数据处理--语法自测

第九章 可配置的程序设计

-9.1 自动售卖程序

--9.1.1 提出问题与初步设计

--9.1.2 细化实现订单处理

--9.1.3 使程序更健壮

-9.2 配制水果信息

--9.2.1 提出问题与设计文件格式

--9.2.2 实现订单处理功能

-9.3 指定界面语言

--9.3.1 提出问题与命令行参数

--9.3.2 实现程序功能

-程设论道

--程设论道

-师生问答

--师生问答

-第九章 可配置的程序设计--语法自测

4.4.2 折半查找思路笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。