- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
对半查找方法(数组的应用)对半查找复习:顺序查找,即从第一个元素开始,顺序查下去直到找到或查到最后一个元素为止。查找是按关键字(keyword)进行,可以唯一地把资料区分出来的数据被称为主关键字。如学生的资料:intid;//学号charname[20];//姓名charsex;//性别intage;//年龄charaddress[60];//家庭地址floateng,phy,electron;//英语,物理和电子学成绩学号可作为主关键字。如果关键字小的排在前面,我们称为升序排列,反之为降序排列。这时可以采用对半查找(binarysearch)。首先安排两个指针low和high指向首尾两元素,取mid=(low+high)/2,如mid指向元素是所查找的,则结束。如果该元素关键字大了,则取low=mid+1,high不变,继续查找;如果该元素关键字小了,则取high=mid-1,low不变,继续查找。如果查到lowhigh仍未找到,则失败,停止。1.对半查找low8917131120719212331262925373923查找lowmidhigh2021292623313739midhighlow202123midhigh23lowmidhigh成功图查找成功例25781113179192023212629313710查找low39midhigh25781113179lowmidhigh1113179lowmidhigh9lowmidhigh图查找失败例这里有一步非常重要:就是low=mid+1和high=mid-1,没有加1和减1时,可能数据存在而找不到。如在图中,如果找到了仅剩20、21、23这一步,这时取low=mid,则剩下21、23,mid=(low+high)/2,得mid=low,下一步low=mid,还是剩下21、23,mid永远不能指向23,永远找不到23了。对半查找递归算法,作为有序表模板类成员函数。递归方法易读易懂,但效率低。注意递归的隐式循环代码编写。对半查找迭代算法该例中迭代算法的可读性也不差,效率要高于递归。注意迭代的显式循环代码编写的关键点。3.对半查找【例】对半查找递归算法intBinarysearch(intslist[],intx,intlow,inthigh){//x为定值intmid=-1;if(low=high){mid=(low+high)/2;if(slist[mid]x)mid=Binarysearch(slist,x,mid+1,high); //中间点小于定值,查找右区间,注意mid+1elseif(xslist[mid])mid=Binarysearch(slist,x,low,mid-1); //中间点大于定值,查找左区间,注意mid-1}returnmid;//找到返回下标;未找到但结束了,返回mid不加判断}递归方法易读易懂,但效率低。注意递归的隐式循环代码编写。【例】对半查找递归算法voidmain(){constinth=19;inti,k=47;inta[h]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67};print(a,h);i=Binarysearch(a,k,0,h-1);cout系数k在表中位置(下标):iendl;}voidprint(intslist[],intlast){ inti; for(i=0;i=last;i++) coutslist[i]; coutendl;}【例】对半查找迭代算法intBinarySearch(intslist[],intx,intlast){inthigh=last,low=0,mid;//last当前有序表最大下标while(low=high){ mid=(low+high)/2; if(xslist[mid]) high=mid-
文档评论(0)