网站大量收购闲置独家精品文档,联系QQ:2885784924

14-Chapter9 -排序.ppt

  1. 1、本文档共84页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
14-Chapter9 -排序

140-* 最大堆的向下调整算法 template class T siftDown (dataListT L, const int start, const int m){ //私有函数: 从结点start开始到m自上向下比较, //如果子女的值大于双亲的值, 则相互交换, 将一 //个集合局部调整为最大堆。 int i = start; int j = 2*i+1; //j是i的左子女 ElementT temp = L[i]; //暂存子树根结点 while (j = m) { //逐层比较 if (j m L[j] L[j+1]) j++; //让j指向两子女中的大者 if (temp = L[j]) break; //temp排序码大不调整 140-* else { //否则子女中的大者上移 L[i] = L[j]; i = j; j = 2*j+1; //i下降到子女位置 } } L[i] = temp; //temp放到合适位置 }; 最大堆堆顶L.Vector[0]具有最大的排序码,将L.Vector[0]与L.Vector[n-1]对调, 把具有最大 基于初始堆进行堆排序 140-* 排序码的元素交换到最后,再对前面的n-1个元素, 使用堆的调整算法siftDown(L, 0, n-2),重新建立最大堆,具有次最大排序码的元素又上浮到L.Vector[0]位置。 再对调L.Vector[0]和L.Vector[n-2],再调用siftDown(L, 0, n-3), 对前面的n-2个元素重新调整,…。 如此反复执行,最后得到全部排序好的元素序列。这个算法即堆排序算法,其细节在下面的程序中给出。 140-* 49 25 25* 21 16 08 0 1 2 3 4 5 08 25 25* 16 21 49 0 2 5 4 3 1 49 25 21 25* 16 08 08 25 21 25* 16 49 交换 0 号与 5 号元素, 5 号元素就位 初始最大堆 140-* 25 25* 08 21 16 49 0 1 2 3 4 5 16 25* 08 25 21 49 0 2 5 4 3 1 25 25* 21 08 16 49 16 25* 21 08 25 49 交换 0 号与 4 号元素, 4 号元素就位 从 0 号到 4 号 重新 调整为最大堆 140-* 25* 16 08 21 25 49 0 1 2 3 4 5 08 16 25* 25 21 49 0 2 5 4 3 1 25* 16 21 08 25 49 08 16 21 25* 25 49 交换 0 号与 3 号元素, 3 号元素就位 从 0 号到 3 号 重新 调整为最大堆 140-* 21 16 25* 08 25 49 0 1 2 3 4 5 08 16 25* 25 21 49 0 2 5 4 3 1 21 16 08 25* 25 49 08 16 21 25* 25 49 交换 0 号与 2 号元素, 2 号元素就位 从 0 号到 2 号 重新 调整为最大堆 140-* 16 08 25* 21 25 49 0 1 2 3 4 5 08 16 25* 25 21 49 0 2 5 4 3 1 16 08 21 25* 25 49 08 16 21 25* 25 49 交换 0 号与 1 号元素, 1 号元素就位 从 0 号到 1 号 重新 调整为最大堆 140-* 堆排序的算法 template class T void HeapSort (dataListT L) { //对表L.Vector[0]到L.Vector[n-1]进行排序, 使得表 //中各个元素按其排序码非递减有序 int i, n = L.length(); for (i = (n-2)/2; i = 0; i--) //将表转换为堆 siftDown (L, i, n-1); for (i = n-1; i = 0; i--) { //对表排序 L.Swap(0, i); siftDown (L, 0, i-1); } }; 140-* 算法分析 设堆中有 n 个结点, 且 2k-1 ≤ n 2k, 则对应的完全二叉树有 k 层。在第 i 层上的结点数≤2i-1 (i = 1, …, k)。在

文档评论(0)

qwd513620855 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档