二分查找及其算法实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二分查找及其算法实现
江苏省扬中中等专业学校 陈廷栋
活动一:问题引入(目标——引入问题)
猜数游戏,请一同学在黑板上写一整数 (在1~50内)。
活动二:探究学习(目标——扩展问题)
以规模为6的数组d为例:用一个数组d[6]来存放序列, left(l) 表示查找范围的第一个数组元素的下标, right(r) 表示最后一个数组元素的下标, mid(m) 表示中间位置元素的下标。
d[0]
d[1] d[2] d[3]
d[4]
d[5]
1 3 5 7 9 11
l m
(1) 第一种情况:要找的值在后半部分; 以查找键x=9为例分析 第一次查找: 范围d[0]~d[5],m= (0+5)/2, d[m]<x 所以可以确定接下来要找的范围是后半部分。 比较后l=m+1
r
第二次查找: 范围d[3]~d[5],m= (3+5)/2,d[m]=x,找到了
d[0] d[1] d[2] d[3]
d[4]
d[5]
1 3 5 7 9 11
l m r
总结一:
如果d[m]<x ,新查找的范围为后半部分, r值不变,l=m+1
(2)第二种情况:要找的值在前半部分; 以查找键x=1为例分析:
d[0]
d[1]
d[2] d[3] d[4]
d[5]
1 3 5 7 9 11
l m
第一次查找:d[0]~d[5],m= (0+5)/2, d[m]>x 所以可以确定接下来要找的范围是前部分。 比较后r=m-1
r
第二次查找: 范围d[0]~d[1],mid= (0+1)/2 , d[m]=x,找到了
d[0]
d[1] d[2] d[3]
d[4]
d[5]
1 3 5 7 9 11
l m
r
总结二:
如果d[m]>x ,新查找范围为前半部分, l值不变,r=m-1。
(3)第三种情况:要找的值找不到; 以查找键x=12为例分析:
d[0] d[1]
d[2] d[3]
d[4] d[5]
1 3 5 7 9 11
l m
d[0] d[1]
d[2] d[3]
d[4]
r
d[5]
1 3 5 7 9 11
d[0] d[1] d[2]
l m r
d[3] d[4] d[5]
1 3 5 7 9 11
lmr
总结三:
(1)找到了查找会结束; (2)在l<=r时重复查找,如果还是找不到,查找也会结束。
活动三:讨论学习(目标——解决问题)
总结查找原理(假设数组按升序排列) 二分查找首先找到中间的元素, ①该元素对应的值小于查找关键字,此时应在 后半 部分继续查 找; ②该元素对应的值大于查找关键字,此时应在前半 部分继续查 找; 找到查找目标,查找结束 ③该元素对应的值等于查找关键字,那么 。 如果出现前两种情况,则继续在前半部分或后半部分内进行 二分查找,直到出现第三种情况为止。如果沿指定方向测试 完所有记录时仍未出现第三种情况,则表示 。 未找到查找目标,查找也结束
特点: 如果查找范围内的元素已经排好序,用二分 查找方法进行查找要比用顺序查找方法 快得多 。
程序实现:有一个数组有六个元素,已按升序排列,今输入一 个数x,要求查找是否为其中的数。对各种情况输出相应的信 息。请用二分查找法编写程序。 main( ) { int x, l=0, r=5, m, f=0; int a[6]={1,3,5,7,9,11}; printf(“请输入一个数x:”); scanf(“%d”,&x); while (f==0 && l<=r) {m=(l+r)/2; if (x==a[m]) f=1; else if(x<a[m]) r=m-1; else l=m+1;} if (f==0) printf(“没有找到”); else printf(“a[%d]=%d”,m,a[m]); }
活动四:课堂检测(目标——检验学习效果)
有一个数组有十个元素,已按降序排列(数 组元素的值通过赋初值给定),今输入一个 数x,要求查找是否为其中的数。对各种情况 输出相应的信息。请用二分查找法编写程序。
课后作业:
已知两集合A={6,12,18,42,44,52,67,94}, B={12,6,94},编程判断集合B是否为A的子集 (提示:若B中的数在A中均存在,则称B是A的子 集)。要求用二分查找法实现。
相关文档
最新文档