二分查找及其算法实现江苏省扬中中等专业学校陈廷栋活动一:问题引入(目标——引入问题)猜数游戏,请一同学在黑板上写一整数(在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+111975311197531lrmd[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+111975311197531rd[0]d[1]d[2]d[3]d[4]d[5]lm(2)第二种情况:要找的值在前半部分;以查找键x=1为例分析:第一次查找:d[0]~d[5],m=(0+5)/2,d[m]x所以可以确定接下来要找的范围是前部分。比较后r=m-111975311197531lrmd[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。11975311197531lmd[0]d[1]d[2]d[3]d[4]d[5]r(3)第三种情况:要找的值找不到;以查找键x=12为例分析:总结三:(1)找到了查找会结束;(2)在l=r时重复查找,如果还是找不到,查找也会结束。11975311197531lrmd[0]d[1]d[2]d[3]d[4]d[5]11975311197531lmrd[0]d[1]d[2]d[3]d[4]d[5]11975311197531rd[0]d[1]d[2]d[3]d[4]d[5]lm活动三:讨论学习(目标——解决问题)总结查找原理(假设数组按升序排列)二分查找首先找到中间的元素,①该元素对应的值小于查找关键字,此时应在部分继续查找;②该元素对应的值大于查找关键字,此时应在部分继续查找;③该元素对应的值等于查找关键字,那么。如果出现前两种情况,则继续在前半部分或后半部分内进行二分查找,直到出现第三种情况为止。如果沿指定方向测试完所有记录时仍未出现第三种情况,则表示。后半前半找到查找目标,查找结束未找到查找目标,查找也结束特点:如果查找范围内的元素已经排好序,用二分查找方法进行查找要比用顺序查找方法。快得多程序实现:有一个数组有六个元素,已按升序排列,今输入一个数x,要求查找是否为其中的数。对各种情况输出相应的信息。请用二分查找法编写程序。main(){intx,l=0,r=5,m,f=0;inta[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;elseif(xa[m])r=m-1;elsel=m+1;}if(f==0)printf(“没有找到”);elseprintf(“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的子集)。要求用二分查找法实现。