数据结构第十章排序幻灯片.ppt

  1. 1、本文档共50页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
将第一名的结点置为最差的,与其兄弟比赛,胜者上升到父结点,胜者兄弟间再比赛,直到根结点,产生第二名83。比较次数为4,即log2n次。 对于n个参赛选手来说,即对n个记录进行树形选择排序,总的关键字比较次数至多为(n?1)log2n?n?1,故时间复杂度为O(nlog2n)。 该方法占用空间较多,除需输出排序结果的n个单元外,尚需n-1个辅助单元。 47 13 0 67 29 83 25 80 51 62 69 31 72 47 79 46 47 67 80 83 72 83 80 62 83 83 47 72 80 79 67 10.4.3 堆排序(Heap Sort) 设有n个元素的序列 k1,k2,…,kn,当且仅当满足下述关系之一时,称之为堆。 ki?k2i 或 ki ? k2i ki?k2i+1 ki ? k2i+1 47 85 24 36 30 53 91 16 36 24 85 47 53 30 12 91 若以一维数组存储一个堆,则堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点的值是最小(或最大)的。 设有n个元素,将其按关键字排序。首先将这n个元素按关键字建成堆,将堆顶元素输出,得到n个元素中关键字最小(或最大)的元素。然后,再对剩下的n-1个元素建成堆,输出堆顶元素,得到n个元素中关键字次小(或次大)的元素。如此反复,便得到一个按关键字有序的序列。称这个过程为堆排序。 实现堆排序需解决两个问题: 1. 如何将n个元素的序列按关键字建成堆; 2. 输出堆顶元素后,怎样调整剩余n-1个元素,使其按关键字成为一个新堆。 首先,讨论输出堆顶元素后,对剩余元素重新建成堆的调整过程。 调整方法:设有m个元素的堆,输出堆顶元素后,剩下m-1个元素。将堆底元素送入堆顶,堆被破坏,其原因仅是根结点不满足堆的性质。将根结点与左、右子女中较小(或小大)的进行交换。若与左子女交换,则左子树堆被破坏,且仅左子树的根结点不满足堆的性质;若与右子女交换,则右子树堆被破坏,且仅右子树的根结点不满足堆的性质。继续对不满足堆性质的子树进行上述交换操作,直到叶子结点,堆被建成。称这个自根结点到叶子结点的调整过程为筛选。 【例】 .输出堆顶12,将 堆低91送入堆顶 36 24 b.堆被破坏,根结 点与右子女交换 36 24 85 47 53 30 12 91 85 47 53 30 91 91 36 85 47 53 30 24 30 36 85 47 24 53 91 c.右子树不满足堆,其根与左子女交换 d.堆已建成 再讨论对n个元素初始建堆的过程。 建堆方法:对初始序列建堆的过程,就是一个反复进行筛选的过程。n个结点的完全二叉树,则最后一个结点是第?n/2?个结点的子女。对第?n/2?个结点为根的子树筛选,使该子树成为堆,之后向前依次对各结点为根的子树进行筛选,使之成为堆,直到根结点。 堆排序:对n个元素的序列进行堆排序,先将其建成堆,以根结点与第n个结点交换;调整前n-1个结点成为堆,再以根结点与第n-1个结点交换;重复上述操作,直到整个序列有序。 36 30 91 47 24 12 53 85 a.8个结点的初始状态 36 30 91 47 24 12 53 85 b.从第4个结点开始筛选 36 30 85 47 24 12 53 91 c.对第3个结点开始筛选 36 12 85 47 24 30 53 91 d.第2个结点为根的子树已是堆 36 12 85 47 24 30 53 91 36 53 85 47 24 30 12 91 e.对整棵树进行筛选 【算法】 void HeapAdjust(S_TBL *h,int s,int m) { /*r[s…m]中的记录关键码除r[s]外均满足堆的定义,本函数将对第s个结点为根的子树筛选,使其成为大顶堆*/ rc=h-r[s]; for(j=2*s;j=m;j=j*2) /* 沿关键码较大的子女结点向下筛选 */ { if(jmh-r[j].keyh-r[j+1].key) j=j+1; /* 为关键码较大的元素下标*/ if(rc.keyh-r[j].key) break; /* rc应插入在位置s上*/ h-r[s]=h-r[j]; s=j; /* 使s结点满足堆定义 */ } h-r[s]=rc; /* 插入 */ } void HeapSort(S_TBL *h) { for(i=h-length/2;

文档评论(0)

开心农场 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档