- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
设含有n个记录的文件{R1, R2, …,Rn }, 其相应的关键字为{K1, K2, …,Kn },需确定一种排列P(1),P(2),…,P(n),使其相应的关键字满足如下的递增(或递减)关系:KP(1) ≤ KP(2) ≤ KP(3) ≤… ≤ KP(n)即,使上述文件成为一个按其关键字线性有序的文件{RP(1) , RP(2) , …,RP(n) },这样一种运算称为排序。 例 K={46,79,56,38,40,84}(1)它的初始堆是: (2)快速排序第一趟结果: (1) 第一次调用筛选法:m=8,i=[m/2]=4,从i=4开始,看k4的左右子树,仅有左子树,因此42与70比较,4270,所以不变。j=i*2=8,i=j,再向下看,此时的i无左右子树,所以返回,如右图所示。 46 55 13 42 94 17 05 70 第二次调用筛选法:i=3, k3 =13,13的左右子树为17和05,因1705,故沿右子树比较,1305,进行对调,此时13无左右子树,所以返回。 46 55 13 42 94 17 05 70 North China Electric Power University 05 13 {46, 55, 13, 42, 94, 17, 05, 70} {46, 55, 05, 42, 94, 17, 13, 70} ? 先看第i个结点的左右子树,设第i个结点的左子树为kj ,右子树为kj+1。若kj kj+1则沿左分支筛,否则沿右分支筛选,即(j=j+1)。将ki与kj 进行比较,若ki kj则对调,小的上来大的下去。 ?然后kj作为新的根结点,再对新的根结点的左右子树进行判断。重复上述过程,直到某个结点的左或右子树根结点的下标大于m为止。 第三次调用筛选法:i=2, k2=55,因为4294,所以沿左子树筛选,4255,进行对调,此时55还有左子树70,因5570,所以不变,再向下70无左右子树,所以返回,此时二叉树如右图所示。 46 55 05 42 94 17 13 70 第四次调用筛选法:i=1, k1=46,因为0542,所以沿右子树筛选,0546,进行对调,此时46还有左右子树17,13,因1317,所以再沿右子树筛选,1346,所以对调,46无左右子树,所以返回,此时二叉树如右图所示。 46 42 05 55 94 17 13 70 North China Electric Power University 55 42 46 05 46 13 {46, 42, 05, 55, 94, 17, 13, 70} {05, 42, 13, 55, 94, 17, 46, 70} ? 先看第i个结点的左右子树,设第i个结点的左子树为kj ,右子树为kj+1。若kj kj+1则沿左分支筛,否则沿右分支筛选,即(j=j+1)。将ki与kj 进行比较,若ki kj则对调,小的上来大的下去。 ?然后kj作为新的根结点,再对新的根结点的左右子树进行判断。重复上述过程,直到某个结点的左或右子树根结点的下标大于m为止。 3. 建堆的算法 void sift(List r, int k, int m) //对m个结点的集合r从某个结点i=k开始筛选,如果r[j]r[j+1](j=2i),则沿右 //分支筛,否则沿左分支筛。把关键字大的筛到堆底。 { i=k; j=2*i; x=r[i]; r[i]=x;//将x放在适当的位置 }//sift North China Electric Power University while (j=m) { if ((jm)(r[j].keyr[j+1].key)) //左子树右子树 j++; //沿右筛 } if (x.keyr[j].key) { r[i]=r[j]; i=j; j=2*i; } //将关键字小的换到i位置,x.key再准备与下一层的比较 else j=m+1; //强制跳出while循环 以上面建的堆为例,说明重建堆的执行过程。 输出05 70 r[1] 05 42 13 55 94 17 46 70 70 42 13 55 94 17 46 05 13 42 17 55 94 70 46 重建堆 输出13 46 r[1] 46 42 17 55 94 70 05 重建堆 05 05 70 X {05,42,13,55,94,17, 46,70
原创力文档


文档评论(0)