资源简介 (共18张PPT)Searching for points in VB selective review25VB选考复习之对分查找00|回顾——对分查找的算法思想对分查找首先将查找的数与有序数组内处于中间位置的数据比较,如果中间位置上的数与查找的数不同,则根据有序性,确定应该在数组的前半部分还是后半部分继续查找。在新确定的范围内,继续按上述方法,直到获得最终结果。特点①要求被查找数据必须有序。②查找效率非常高,适用于大数据查找。00|回顾——对分查找的算法思想对分查找·演算一用数组d(1 to 10)存放数组序列,用i表示查找范围的第一个数组元素下标,用j表示最后一个数组元素下标。假如查找键key=48?10151718222735454852d(1)d(2)d(3)d(4)d(5)d(6)d(7)d(8)d(9)d(10)←i←j←mid第1次查找:范围为__________,i=________,j=_____,mid=___________。d(mid)=__________。d(mid)_____key?∴后续查找的范围应该是_______________。d(1)~d(10)110(1+10)\2=5d(5)=22<d(6)~d(10)00|回顾——对分查找的算法思想对分查找·演算一用数组d(1 to 10)存放数组序列,用i表示查找范围的第一个数组元素下标,用j表示最后一个数组元素下标。假如查找键key=48?10151718222735454852d(1)d(2)d(3)d(4)d(5)d(6)d(7)d(8)d(9)d(10)←i←j←mid2735454852d(6)d(7)d(8)d(9)d(10)←i←j←mid第2次查找:范围为_____________,i=________,j=_____,mid=___________。d(mid)=______。d(mid)_____key?∴后续查找的范围应该是_______________。d(6)~d(10)610(6+10)\2=845<d(9)~d(10)00|回顾——对分查找的算法思想用数组d(1 to 10)存放数组序列,用i表示查找范围的第一个数组元素下标,用j表示最后一个数组元素下标。假如查找键key=48?10151718222735454852d(1)d(2)d(3)d(4)d(5)d(6)d(7)d(8)d(9)d(10)←i←j←mid2735454852d(6)d(7)d(8)d(9)d(10)←i←j←mid4852d(9)d(10)←i←j←mid第3次查找:范围为_____________,i=________,j=_____,mid=___________。d(mid)=______。d(mid)_____key?d(9)~d(10)910(9+10)\2=948=提示查找成功对分查找·演算一00|回顾——对分查找的算法思想对分查找·演算二用数组d(1 to 10)存放数组序列,用i表示查找范围的第一个数组元素下标,用j表示最后一个数组元素下标。假如查找键key=17?10151718222735454852d(1)d(2)d(3)d(4)d(5)d(6)d(7)d(8)d(9)d(10)第一次查找:d(1)~d(10),i=1,j=10,mid=5,d(mid)>key第二次查找:d(1)~d(4),i=1,j=4,mid=2,d(mid)第三次查找:d(3)~d(4),i=3,j=4,mid=3,d(mid)=key思考①若d(mid)>key,则新查找的范围为______部分(前半/后半)②若d(mid)>key ,i和j是如何变化的?前半i不变,j=mid-100|回顾——对分查找的算法思想对分查找·演算三用数组d(1 to 10)存放数组序列,用i表示查找范围的第一个数组元素下标,用j表示最后一个数组元素下标。假如查找键key=20?10151718222735454852d(1)d(2)d(3)d(4)d(5)d(6)d(7)d(8)d(9)d(10)←i←j←mid10151718d(1)d(2)d(3)d(4)←i←j←mid1718d(3)d(4)←i←j←mid18d(4)←i,j,mid思考继续进行查找的条件是什么?在什么情况下查找会结束?当i<=j时,重复查找,无论找到找不到,查找都会结束。00|回顾——对分查找的算法思想对分查找·归纳(1)key与d(mid)的大小比较影响i,j在后续查找中的取值。①若d(mid)②若d(mid)>key,则j=mid-1,i不变(2)继续重复进行查找的条件。当i<=j时(3)对分查找最多的查找次数(n个数据)。最多次数=Int(log2n)+1∵n个数据对分x次最后变为1个数据∴n*(1/2)^x=1∴x=log2n∵最后一个数据还要参与一次查找∴最多次数=Int(log2n)+100|回顾——对分查找的典型程序段现有n个从小到大的数据,存放在数组a(1 To n)中,要查找的数key。i=1:j=nx=0Do While__________m=______________If d(m)=key Thenx=mExit DoEnd IfIf d(m)>key Then_________Else_________End IfLoopIf x<>0 Thenlist1.additem “查找成功下标为”+str(x)Elselist1.additem “查找失败”End Ifi<=j(i+j)\2j=m-1i=m+1①给i,j赋初值,用x来记录查找元素下标②当i<=j时,重复执行查找工作③对分,取中值m④判断中值是否就是查找键⑤如果中值不是查找键,则判定下一个查找范围应该在前半部分还是在后半部分。注意i和j的控制。⑥输出查找结果00|回顾——对分查找的典型代码段其中取中间位置 m 的方法常见的还有:m=(i+j)\2m=Int((i+j)/2)m=Int((i+j+1)/2)m=Fix((i+j)/2)m =Fix((i + j) / 2 + 0.5)01|第24课 作业讲解1. 数组元素d(1)到d(6)的值依次为“11,19,25,31,47,58”。Key=31,i的初始值是1,j的初始值是的6,进行对分查找,找到即停止查找,停止时下列选项中正确的是( )A. 变量i的值为3B.变量i的值为4C.变量j的值为6D. 变量j的值为5d(1) d(2) d(3) d(4) d(5) d(6)11 19 25 31 47 58B01|第24课 作业讲解2.在已排序的数组d(数组元素d(1)≥d(2)≥…≥d(n))中查找键值为key的数,其对分查找的VB程序段如下:i=1:j= nxb= 0Do While i <= jm=Fix((i+j)/2)If d(m) = Key Then xb = m :Exit DoIf Then j =m – 1 Else i=m+1Loop划线处的语句为( )A. key>d(m) B. keyd(m) D. key=d(m)A01|第24课 作业讲解3.某对分査找算法的 VB 程序段如下:i = 1:j = 7:s = ""key = Int(Rnd * 100)Do While i <= jm = (i + j) \ 2If key = a(m) Thens = s + "M": Exit doElseIf key < a(m) Thenj = m - 1:s = s + "L"Elsei = m + 1:s = s + "R"End IfLoopText1.Text = s数组元素 a(1)到 a(7)的值依次为“24,35,38,41,45,69,78”。若该程序段执行后,文本框 Text1 中显示的内容可能是( )A. RL B. LMR C. RLR D. LRLMC01|第24课 作业讲解4. 某对分查找算法的VB程序段如下:c= 0:i =1: j =8: f = Falsekey = Val(Text1.Text)Do While i < = j And Not fm =Int((i + j) / 2 + 0.5)c= c+ 1If key = d(m) Thenf = TrueElseIf key > d(m) Thenj = m - 1Elsei = m + 1End IfLoop数组元素d(1)到d(8)的值依次为“97, 79, 68,48, 35,23,18,10”,若运行该程序段后,c的值为2,则Text1中输入的值是( )A.68或18 B.68或23 C.79或23 D.79或18A01|第24课 作业讲解5.某对分查找算法如下:Key=val(text1.text)Text2.text=””Flag=Truei=1:j=8do while i<=j and flagm=(i+j)\2if key=a(m) thenflag=falseelseif key>a(m) theni=m+1elsej=m-1end iftext2.text=text2.text+str(m)loop数组a(1)到a(8)的值依次为”1, 3 ,5, 8 ,10 ,13 ,16,21”,在text1中输入7, 执行该程序段,下列说法正确的是( )A、flag值为false B、文本框text2中显示内容为“ 4 2 3” C、i值为3 D、j值为4B01|第24课 作业讲解6. 某对分查找算法的 VB 程序段如下:t = "":i = 0 : j = 9 : key=62: f = FalseDo While i <= j And Not fm = Fix((i + j) / 2)t = t + Str(m)If a(m) = key Thenf = TrueElseIf a(m) > key Theni = m + 1t = t + "→"Elsej = m - 1t = t + "←"End IfLoop数组元素 a(0)到 a(9)的值依次为“99,94,90,87,78,70,63,56,45,36”,执行该程序段,t的值是( )"4→ 7← 5→" B. "4→ 7← 5→ 6"C."4→ 7← 5→ 6→“ D. "4→ 7← 5"C01|第24课 作业讲解7.有如下VB程序段:i = 1 : j = 10 : flag = True : n = 0Key = Val(Text1.Text)Do While i <= j And flag = Truem = (i + j) \ 2If a(m) = Key Thenflag = FalseElseif a(m) > Key Theni = m + 1 : n = n - 1Elsej = m - 1 : n = n + 1End IfLoop数组元素a(1)到a(10)依次是99, 94, 90, 87, 70,69,60,56,45,36,变量n的值最终是0,则文本框Text1输入的数字可能是( )A.100 B.87 C.69 D.41C02|对分查找训练课堂练习1:使用对分查找算法查找数据9,访问到的数据依次是____________________。VB语句如下,请填空:Key = Val(Text1.Text)i = 1j = nDo While i <= j_________________If____________ ThenText1.text = "在数组的 " + Str(M) + " 位置中"Exit SubEnd IfIf Key > d(m) Then__________Else___________End IfLoopif i>j then Label6.Caption = "在数组中没有找到"13,5,9m=(i+j)\2d(m)=keyi=m+1j=m-1 展开更多...... 收起↑ 资源预览