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

第6章_堆排序_算法分析与设计_杭电_褚一平.ppt

第6章_堆排序_算法分析与设计_杭电_褚一平.ppt

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

28 优先级队列的操作 程序MAX-HEAP-INSERT实现了INSERT操作 MAX-HEAP-INSERT(A,key) 1 heap-size[A]←heap-size[A]+1 2 A[heap-size[A]]←-∞ 3 HEAP-INCREASE-KEY(A, heap-size[A], key) * * 4 6.1 堆 (二叉)堆数据结构是一种数组对象,它可以被视为一颗完 全二叉树,树中每个节点和数组中存放该节点值的那个元 素对应。如果表示堆的数组为A,那么树的根为A[1]。 表示堆的数组A是一个具有两个属性的对象:length(A)是 数组中的元素个数,heap-size(A)是存放在A中的堆的元素 个数;A[heap-size(A)]之后的元素都不属于相应的堆。也 就是:Heap-size(A)=length(A) 给定某个节点的下标i,其父节点PARENT(i),左儿子 LEFT(i)和右儿子RIGHT(i)可以表示为 LEFT(i): 2i RIGHT(i): 2i +1 PARENT(i): ?i / 2? 5 堆的示例 6 6.1 最大堆和最小堆 二叉堆有两种:最大堆和最小堆 对于最大堆,除了根以外的每个节点,有 A[PARENT(i)] ≥A[i] 这样,堆中的最大元素就存放在根节点中,并且在 以某一个节点为根的子树中,各节点的值都不大于 该子树根节点的值 对于最小堆,除了根以外的每个节点,有 A[PARENT(i)] ≤A[i],最小堆的最小元素在跟部。 堆可以被看成一棵树,节点在堆中的高度定义为 从本节点到叶子的最长简单下降路径上边的个 数。堆的高度定义为树根的高度,为Θ(lgn)。 7 6.2 保持堆的性质 MAX-HEAPIFY是对最大堆进行操作的重要的子 程序,调整A[i]在堆中的位置,使以i为根的子树 为最大堆 MAX-HEAPIFY(A,i) 1 l ← LEFT(i) 2 r ← RIGHT(i) 3 If l ≤ heap-size[A] and A[l] A[i] 4 then largest ← l 5 else largest ← i 6 If r ≤ heap-size[A] and A[r] A[largest] 7 then largest ← r 8 If largest ≠ i 9 then exchange A[i]?A[largest] 10 MAX-HEAPIFY(A, largest) 8 6.1 MAX-HEAPIFY过程 9 6.1 MAX-HEAPIFY过程 10 6.1 MAX-HEAPIFY过程 11 6.2 MAX-HEAPIFY时间 当MAX-HEAPIFY作用在一棵以节点i为根的, 大小为n的子树上时,其运行时间为调整元素 A[i],A[LEFT(i)]和A[RIGHT(i)]的关系时所用时 间Θ(1),再加上对以i的某个子结点为根的子树 递归调用MAX-HEAPIFY所需的时间。i结点的 子树大小至多为2n/3,那么MAX-HEAPFY的运 行时间为: T(n) ≤ T(2n/3) + Θ(1) 根据主定理,该递归式的解为T(n) ≤ Θ(lgn) 12 6.3 建堆 我们可以自底向上的用MAX-HEAPIFY来将一个 数组A[1..n]变成一个最大堆。过程BUILD-MAX- HEAP对树中的每一个其他节点都调用一次 MAX-HEAPIFY。 BUILD-MAX-HEAP(A) 1 heap-size[A] ← length[A] do MAX-HEAPIFY(A,i) 2 for i ← ?length[ A] / 2? downto 1 13 建堆过程 14 建堆过程 15 建堆过程 16 建堆过程 17 建堆过程 18 建堆过程 19 BUILD-MAX-HEAP正确性 为了证明BUILD-MAX-HEAP的正确性,我们使 用如下的循环不变式: 在第2~3行中for循环的每一次迭代开始时,节 点i+1,i+2,… n都是一个最大堆的根。 我们需要证明在第一次循环迭代之前,这个不 变式已为真。每次循环迭代都能保持此不变 式,并且在循环结束时这个不变式会提供一个 很有用的属性来显示程序的正确性。 20 BUILD-MAX-HEAP正确性 也是平凡最大堆的根。 保持:要证明每次迭代都保持了循环不变式, 注意到结点i的子结点的编号均比i大,于是,根 据循环不变式,这些子结点都是最大堆的根。 这也是调用函数MAX-HEAPIFY(A,i),以使结点 i成为最大堆的根的前提条件。此外,MAX- HEAPFY的调用保持了结点i+1,i+2,…n为最大 堆的性质。

文档评论(0)

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

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

1亿VIP精品文档

相关文档