- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
二分查找及其算法实现 江苏省扬中中等专业学校 陈廷栋 活动一:问题引入(目标——引入问题) 猜数游戏,请一同学在黑板上写一整数(在1~50内)。 活动二:探究学习(目标——扩展问题) 以规模为6的数组d为例:用一个数组d[6]来存放序列, left(l) 表示查找范围的第一个数组元素的下标, right(r) 表示最后一个数组元素的下标, mid(m) 表示中间位置元素的下标。 (1)?? 第一种情况:要找的值在后半部分; 以查找键x=9为例分析 第一次查找: 范围d[0]~d[5],m= (0+5)/2, d[m]x 所以可以确定接下来要找的范围是后半部分。 比较后l=m+1 11 9 7 5 3 1 11 9 7 5 3 1 l r m d[0] d[1] d[2] d[3] d[4] d[5] 第二次查找: 范围d[3]~d[5],m= (3+5)/2,d[m]=x,找到了 总结一: 如果d[m]x ,新查找的范围为后半部分, r值不变,l=m+1 11 9 7 5 3 1 11 9 7 5 3 1 r d[0] d[1] d[2] d[3] d[4] d[5] l m (2)第二种情况:要找的值在前半部分; 以查找键x=1为例分析: 第一次查找:d[0]~d[5],m= (0+5)/2, d[m]x 所以可以确定接下来要找的范围是前部分。 比较后r=m-1 11 9 7 5 3 1 11 9 7 5 3 1 l r m d[0] d[1] d[2] d[3] d[4] d[5] 第二次查找: 范围d[0]~d[1],mid= (0+1)/2 , d[m]=x,找到了 总结二: 如果d[m]x ,新查找范围为前半部分,?? l值不变,r=m-1。 11 9 7 5 3 1 11 9 7 5 3 1 l m d[0] d[1] d[2] d[3] d[4] d[5] r (3)第三种情况:要找的值找不到; 以查找键x=12为例分析: 总结三: (1)找到了查找会结束; (2)在l=r时重复查找,如果还是找不到,查找也会结束。 11 9 7 5 3 1 11 9 7 5 3 1 l r m d[0] d[1] d[2] d[3] d[4] d[5] 11 9 7 5 3 1 11 9 7 5 3 1 l m r d[0] d[1] d[2] d[3] d[4] d[5] 11 9 7 5 3 1 11 9 7 5 3 1 r d[0] d[1] d[2] d[3] d[4] d[5] l m 活动三:讨论学习(目标——解决问题) 总结查找原理(假设数组按升序排列) 二分查找首先找到中间的元素, ①该元素对应的值小于查找关键字,此时应在 部分继续查找; ②该元素对应的值大于查找关键字,此时应在 部分继续查找; ③该元素对应的值等于查找关键字,那么 。 如果出现前两种情况,则继续在前半部分或后半部分内进行二分查找,直到出现第三种情况为止。如果沿指定方向测试完所有记录时仍未出现第三种情况,则表示 。 后半 前半 找到查找目标,查找结束 未找到查找目标,查找也结束 特点: 如果查找范围内的元素已经排好序,用二分 查找方法进行查找要比用顺序查找方法 。 快得多 程序实现:有一个数组有六个元素,已按升序排列,今输入一个数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(xa[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的子集)。要求用二分查找法实现。 谢谢大家
文档评论(0)