- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
对分查找算法
及程序实现;1.对分查找的概念
对分查找又称二分查找,是一种高效的查找方法。对分查找的前提是,被查找的数据序列是有序的(升序或降序)。
对分查找的基本思想是在有序的数列中,首先将要查找的数据与有序数列内处于中间位置的数据进行比较,如果两者相等,则查找成功;否则就根据数据的有序性,再确定该数据的范围应该在数列的前半部分还是后半部分;在新确定的缩少范围内,继续按上述方法进行查找,直到找到要查找的数据,即查找成功,如果要查找的数据不存在,即查找不成功。;2.对分查找的过程
若key为查找键,数组d存放n个已按升序排序的数据。在使用对分查找时,把查找范围[i,j]的中间位置上的数据d(m)与查找键key进行比较,结果必然是如下三种情况之一:
(1)若keyd(m),查找键小于中点d(m)处的数据。由数组d中的数据的递增性,可以确定:在(m,j)内不可能存在值为key的数据,必须在新的范围(i,m-1)中继续查找;
(2)key=d(m),找到了需要的数据;
(3)keyd(m),查找键大于中点d(m)处的数据。由数组d中的数据的递减性,可以确定:在(i , m)内不可能存在值为key的数据,必须在新的范围(m+1,j)中继续查找。
这样,除了出现情况(2),在通过一次比较后,新的查找范围将不超过上次查找范围的一半。;10;Int、Fix 函数:
返回数字的整数部分。
Int函数和 Fix 函数都删除 number 参数的小数部分并返回以整数表示的结果。
Int 和 Fix 函数的区别在于如果 number 参数为负数时,Int 函数返回小于或等于 number 的第一个负整数,而 Fix 函数返回大于或等于 number 参数的第一个负整数。
例如,Int 将 -8.9 转换为 -9,而 Fix 函数将 -8.9 转换为 -8。
;10;10;3.对分查找算法的表示
使用对分查找在数组变量d中查找key,用自然语言描述的算法如下:
(1)(确定初始查找范围)i←1,j←n。
(2)(是否能继续查找?)如果i≤j,那么转到(4)。
(3)(找不到)输入出结果0,算法结束。
(4)(计算中点位置)m←(i+j)\2。
(5)(相等?)如果d(m)=key,那么转到(7)。
(6)(修改查找范围)如果keyd(m),那么j←m-1;如果 keyd(m),那么i←m+1,转到(2)。
(7)(找到)输出结果m,算法结束。;使用流程图描述对分查找的算法如下图所示:;4.对分查找算法程序的实现要点
(1)由于比较次数难以确定,所以用Do语句来实现循环;
(2)在Do循环体中用If语句来判断查找是否成功;
(3)若查找成功则输出查找结果,并结束循环(Exit Do);
(4)若查找不成功,则判断查找键在数组的左半区间还是右半区间,从而缩小范围。;对分查找程序的基本框架:
Private Sub Command1_Click()
i = 1: j = n
Do While i = j
m = (i + j) \ 2
If d(m) = Key Then
输出结果,退出查找(代码略)
ElseIf Key d(m) Then
j = m - 1
Else
i = m + 1
End If
Loop
End Sub;;;;;;例题:对分查找;1、首先在通用声明事件里定义数组d变量为全局变量。
Dim d(1 To 10) As Integer
2、程序一运行,生成10个3位整数,显示在标签1中。
Private Sub Form_Load()
Label1.Caption =
Randomize
For i = 1 To 10
d(i) = Int(Rnd * 101 + 100)
Label1.Caption = Label1.Caption d(i)
Next i
End Sub;3、单击“升序排序”按钮,按从小到大进行排序,并将结果显示在标签2中。
Private Sub Command1_Click()
For i = 1 To 9
Min = d(i)
For j = i + 1 To 10
If d(j) Min Then
Min = d(j)
t = d(i): d(i) = d(j): d(j) = t
End If
Next j
Next i
Label2.Caption =
For i = 1 To 10
Label2.Capti
原创力文档


文档评论(0)