15. 蛤蟆的数据构进阶十五排序实现之堆排序.docxVIP

15. 蛤蟆的数据构进阶十五排序实现之堆排序.docx

  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文档。上传文档
查看更多
15. 蛤蟆的数据构进阶十五排序实现之堆排序

15. 蛤蟆的数据结构进阶十五排序实现之堆排序 本篇名言:“谁要是游戏人生 , 他就一事无成 ; 谁不能主宰自己 , 永远是一个奴隶 。-- 歌德” 继续来看下堆排序。 堆排序 堆排序(Heapsort)是指利用堆积树(堆)这种 HYPERLINK /view/9900.htm \t _blank 数据结构所设计的一种 HYPERLINK /view/297739.htm \t _blank 排序算法,它是选择排序的一种。可以利用 HYPERLINK /view/209670.htm \t _blank 数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] = A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。 (a)大顶堆序列:(96, 83,27,38,11,09) ? (b)? 小顶堆序列:(12,36,24,85,47,30,53,91) 如图建堆初始过程:无序序列:(49,38,65,97,76,13,27,49) ??????????????????????????????????????? 代码实现 从一个无序序列建堆的过程就是一个反复筛选的过程。若将此序列看成是一个完全二叉树,则最后一个非终端节点是第[n/2]个元素,由此筛选只需从第[n/2]个元素开始。 代码核心是先将数组假想为完全二叉树。那么偶数位的数是左孩子,奇数位的数是右孩子。 先将数组进行完全二叉树处理,然后将根节点提取出来放到数组最后,将原先数组的最后一个元素放到根节点,因为不能保证原先数组最后一个的元素是剩下元素中最大的,所以要紧接着做一次处理(此次处理将最后一个元素除外)。接下去是继续去根节点放到数组倒数第二个位置,以此循环。 实现如下图1: 源码 #include stdio.h void print(int a[], int n){ for(int j= 0; jn; j++){ printf(%d ,a[j]); } } /** * 已知H[s…m]除了H[s] 外均满足堆的定义 * 调整H[s],使其成为大顶堆 即将对第s个结点为根的子树筛选, * * @param H是待调整的堆数组 * @param s是待调整的数组元素的位置 * @param length是数组的长度 * */ void HeapAdjust(int H[],int s, int length) { int tmp = H[s]; int child = 2*s+1; //左孩子结点的位置。(i+1 为当前调整结点的右孩子结点的位置) while (child length) { if(child+1 length H[child]H[child+1]) { // 如果右孩子大于左孩子(找到比当前待调整结点大的孩子结点) ++child ; } if(H[s]H[child]) { // 如果较大的子结点大于父结点 H[s] = H[child]; // 那么把较大的子结点往上移动,替换它的父结点 s = child; // 重新设置s ,即待调整的下一个结点的位置 child = 2*s+1; } else { // 如果当前待调整结点大于它的左右孩子,则不需要调整,直接退出 break; } H[s] = tmp; // 当前待调整的结点放到比其大的孩子结点位置上 } // print(H,length); } /** * 初始堆进行调整 * 将H[ length-1]建成堆 * 调整完之后第一个元素是序列的最小的元素 */ void BuildingHeap(int H[], int length) { //最后一个有孩子的节点的位置 i= (length -1) / 2 for (int i = (length -1) / 2 ; i = 0; --i) HeapAdjust(H,i,length); } /** * 堆排序算法 */ void HeapSort(int H[],int length) { //初始堆 BuildingHeap(H, length); //从最后一个元素开始对序列进行调整 for (int i = length - 1; i 0; --

文档评论(0)

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

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

1亿VIP精品文档

相关文档