堆 本科精品课件.pptx

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

例5-12:堆排序(优先队列)堆排序是一种树型选择排序在排序过程中,将R[0]~R[n-1]看成是完全二叉树顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择关键字最小记录1排序算法思想

1、根据初始输入,形成初始堆。2、通过一系列的对象交换和重新调整进行排序。堆排序分为两个步骤:2排序算法思想

堆的定义n个关键字序列K1,k2,...,Kn称为堆,当且仅当该序列满足特性:从堆的定义可以看出,堆实质上是满足如下性质的二叉树:树中任一非叶子结点的关键字均小于或等于它的孩子结点的关键字。3排序算法思想

101556253070101556253070小根堆示例4排序算法思想

705630251510705630251510大根堆示例5排序算法思想

堆排序的第一个工作是建堆,即把整个记录数组R[1]~R[n]调整为一个堆。显然,只有一个结点的树是堆,而在完全二叉树中,所有序号i=的结点都是叶子,因此以这些结点为根的子树都已是堆。这样,我们只需依次将序号为n/2,n/2-1,...,1的结点作为根的子树都调整为堆即可。我们以大根堆为例进行说明6排序算法思想

若已知结点R[i]的左右子树已是堆,如何将以R[i]为根的完全二叉树也调整为堆?解决这一问题可采用“筛选法”基本思想是:因为R[i]的左右子树已是堆,这两棵子树的根分别是各自子树中关键字最大的结点,所以我们必须在R[i]和它的左右孩子中选取关键字最大的结点放到R[i]的位置上。步骤如下:7排序算法思想

①若R[i]的关键字已是三者中的最大者,则以R[i]为根的子树已构成堆,无须调整。②若R[i]的关键字不是三者中的最大者,则必须将R[i]和具有最大关键字的左孩子R[2i]或右孩子R[2i+1]进行交换。假定R[2i]的关键字最大,将R[i]和R[2i]交换位置,交换之后有可能导致R[2i]为根的子树不再是堆,但由于R[2i]的左右子树仍然是堆,于是可以重复上述过程,将以R[2i]为根的子树调整为堆,...,如此逐层递推下去,最多可能调整到树叶。8排序算法思想

例子:关键字序列为42,13,91,23,24,16,05,88,n=8,故从第四个结点开始调整421391232416058842139123241605889排序算法思想

42139188241605234213918824160523不调整10排序算法思想

4213918824160523421391882416052311排序算法思想

4288912324160513428891232416051312排序算法思想

91884223241605139188422324160513建成的堆13排序算法思想

上述算法只是对一个指定的结点进行调整。有了这个算法,则将初始的无序区R[1]到R[n]建成一个大根堆由于建堆的结果把关键字最大的记录选到了堆顶的位置,而排序的结果应是升序,所以,应该将R[1]和R[n]交换,这就得到了第一趟排序的结果。14排序算法思想

第二趟排序的操作首先是将无序区R[1]到R[n-1]调整为堆(R[n]是有序区了)。这时对于当前堆来说,它的左右子树仍然是堆,所以,可以调用Heapify函数将R[1]到R[n-1]调整为大根堆,选出最大关键字放入堆顶,然后将堆顶与当前无序区的最后一个记录R[n-1]交换(这样无序区变为R[1]到R[n-2],有序区变为R[n-1]到R[n]),如此反复进行下去。15排序算法思想

91884223241605139188422324160513(a)初始堆R[1]到R[8]堆排序示例16排序算法思想

13884223241605911388422324160591(b)第一趟排序之后17排序算法思想

(c)重建的堆R[1]到R[7]8824422313160591882442231316059118排序算法思想

05244223131688910524422313168891(d)第二趟排序之后19排序算法思想

(e)重建的堆R[1]到R[6]4224162313058891422416231305889120排序算法思想

(f)第三趟排序之后0524162313428891052416231342889121排序算法思想

(g)重建的堆R[1]到R[5]2423160513428891242316051342889122排序算法思想

(h)第四趟排序之后1323160524428891132316052442889123排序算法思想

(i)重建的堆R[1]到R[4]231316052442889123131605244

文档评论(0)

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

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

1亿VIP精品文档

相关文档