第9章_缩小规模算法.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9章_缩小规模算法

第9章 缩小规模算法 第9章 缩小规模算法 二分搜索技术 归并排序 快速排序 习题 设记录序列的存储结构为一维数组,关键字为int型,待排序记录的的数组类型说明如下 typedef struct { int key; datatype other; }rectype; rectype[n]; 二分搜索技术(二分查找、折半查找) 要求线性表是顺序存储结构的有序表。 n个记录R[0]~R[n-1]按关键字key递增有序,在n个记录中找出关键字的值为x的记录。 算法的基本思想: (1)先求位于查找区间正中的记录的下标mid: mid= (low+high)/2」 (2)用其关键字与给定值x比较: 如果 x = = R[mid].key,则查找成功,返回mid值 如果 x R[mid].key,则在左区间继续查找,置 high=mid-1 如果x R[mid].key,则在右区间继续查找,置low=mid+1 (3) 重复计算mid 以及R[mid].key与x比较,每比较一次,查找区间缩小一半。当lowhigh时,表明查找不成功,查找结束,返回-1。 折半查找算法 int BinSearch(rectype R[ ],KeyType x) { int low,high,mid; //low、high表示当前查找区间的下界、上界 low = 0; high = n-1; //设置查找区间下界、上界的初值 while (low = high) //当前查找区间非空 { mid = (low+high)/2; //取当前查找区间的中点 if (x==R[mid].key) return mid; //查找成功,返回 else if(xR[mid].key)) high = mid-1; //在左区间查找 else low = mid+1; //在右区间查找 } return -1; //查找失败 } 对于有序序列:-1、0、1、3、4、6、8、10、12,折半查找判定树: 对于有序序列:-1、0、1、3、4、6、8、10、12,描述折半查找过程的判定树及查找6和5的过程: 归并排序 算法思想 二路归并排序(归并排序):假设初始表含有n个记录,则可看成是n个有序的子表,每个子表的长度为1,然后两两归并,得到?n/2?个长度为2或1的有序子表,再两两归并,……如此重复,直至得到一个长度为n的有序子表为止。 归并的过程 将两个有序子表合并为一个有序子表的过程称为“归并”,类似于玩扑克牌:假设桌上有两堆面朝上的牌,最小的排在上面(本身有序),现要将这两堆牌(看作输入)合并成一堆有序的牌(看作输出)。基本步骤是比较两输入堆顶上的两张牌,取出较小的那张牌将它面朝下放到输出堆中。重复这一步骤,直至某一输入堆为空,这是将另一输入堆中剩余的牌面朝下全部放入到输出堆中即可。如图所示: 设两个有序子表(相当于输入堆)放在同一向量中相邻的位置上:R[low..mid],R[mid+1..high],先将它们合并到一个局部的暂存变量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中。 二路归并排序(MergeSort)调用一趟归并算法(MergePass),一趟归并算法(MergePass)调用二路归并算法(Merge)。 二路归并算法 void MERGE(rectype R[], int low,int mid,int high) /* R[low..mid]与R[mid+1..high]是同一数组中两个有序子表,二路归并结果为一个有序子表R1[low..high] ,结果保存在R中*/ { int i=low,j=mid+1,k=0; rectype*R1=(rectype *)malloc((high- low+1)*sizeof(rectype)); while ((i=mid) (j=high)) if(R[i].key=R[j].key) R1[k++]=R[i++]; else R1[k++]=R[j++]; // 取小者复制到R1[k] while(i=mid) R1[k++]=R[i++];//复制第一个子表的剩余记录 while(j=high) R1[k++]=R[j++]; //复制第二个子表的剩余记录 k=0,i=low; while(i=high) R[i++]=R1[k++]; } 一趟归并

文档评论(0)

pangzilva + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档