14.堆排序

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

个元素组成的序列{ 【例1】将10个元素组成的序列 34, 39, 20, 65, 47, 】 个元素组成的序列 12, 98, 73, 81, 56 }建成大根堆。 建成大根堆。 建成大根堆 将序列看成是完全二叉树的按层次遍历结果, ①将序列看成是完全二叉树的按层次遍历结果,建 立完全二叉树; 立完全二叉树;
对第i个关键字进行筛选的要点: 对第i个关键字进行筛选的要点: 在第2i个结点和第2i+1个结点中(左右孩子) 2i个结点和第2i+1个结点中 ① 在第2i个结点和第2i+1个结点中(左右孩子) 选大者定为X; 大者定为X 定为 若第i个结点( 小于X则二者交换 交换; ② 若第i个结点(根)小于X则二者交换; 交换后还须考虑以2i为根或以2i+1 2i为根或以2i+1为根的子树 ③ 交换后还须考虑以2i为根或以2i+1为根的子树 是否仍然是堆,若不是则需要继续向下调整; 是否仍然是堆,若不是则需要继续向下调整;
1 2 4 8 5 9 10 11 6 3 7 8 4 2 5 9 10 11 6 12 1 3 7
12 13 14 15
回顾Байду номын сангаас
对于具有n个结点的完全二叉树,如果按照从上至下, 对于具有 个结点的完全二叉树,如果按照从上至下, 个结点的完全二叉树 上至下 每层从左至右的次序 对结点进行编号, 编号为i的 的次序, 每层从左至右的次序,对结点进行编号,则编号为 的 结点有以下性质: 结点有以下性质: 的结点为分支结点, 若i≤ n/2 , 即2i≤n,则编号为 的结点为分支结点, 则编号为i的结点为分支结点 否则为叶子结点 为奇数, 若n为奇数,则树中每个分支结点既有左孩子又有右 为奇数 孩子; 为偶数, 孩子;若n为偶数,则编号最大的分支结点 编号为 为偶数 则编号最大的分支结点(编号为 n/2)只有左孩子,没有右孩子,其余分支结点左、 只有左孩子, 只有左孩子 没有右孩子,其余分支结点左、 右孩子都有 若编号为i 的结点有左孩子,则左子结点的编号为2i; 若编号为 的结点有左孩子,则左子结点的编号为 ; 若编号为i的结点有右孩子则右子结点为 的结点有右孩子则右子结点为2i+1 若编号为 的结点有右孩子则右子结点为 除树根结点外,若一个结点的编号为i, 除树根结点外,若一个结点的编号为 ,则它的双亲 结点的编号为 结点的编号为 i/2
自下向上将完全二叉树调整为大根堆(动画演示) ②自下向上将完全二叉树调整为大根堆(动画演示)
堆的删除——删除堆顶元素 删除堆顶元素 堆的删除
堆尾元素写入堆顶; 元素写入堆顶 ①将堆尾元素写入堆顶;
②自上而下调整受影响的子树,使每一棵有变动 调整受影响的子树,
的子树都符合堆的要求; 的子树都符合堆的要求; 如果调整后改变了的子树的根结点, ③如果调整后改变了的子树的根结点,则继续调 整相应的子树直到堆的叶子结点 叶子结点。 整相应的子树直到堆的叶子结点。
1 9 2 17 4 23 8 53 5 45 9 31 堆顶元素值最小 6 78 3 65 7 87
以大根堆为例) 堆的建立(以大根堆为例)
① 将给定的序列看成是完全二叉树的按层次遍
历结果,并建立对应的完全二叉树; 历结果,并建立对应的完全二叉树; 从最后一个非终端结点( ② 从最后一个非终端结点(i=n/2)开始,依次 )开始, 调整每一棵子树为大根堆。( 调整每一棵子树为大根堆。(自下向上逐步 调整为堆)
【例2】删除堆顶元素 】删除堆顶元素98
98 81 73 56 12 34 20 39 81 73 47 39 65 56 12 34 20 65 39 47 73 56 12 73 65 81 34 20 81 56 12 47 34 20 73 39 65 47 56 12 81 34 20
ki ≥ k2i ki ≤ k2i (1) 或(2) (i = 1,2,L, n / 2) ki ≥ k2i +1 ki ≤ k2i+1
若将和此序列对应的一维数组(即以一维数组作 若将和此序列对应的一维数组 即以一维数组作 此序列的存储结构)看成是一个完全二叉树 看成是一个完全二叉树, 此序列的存储结构 看成是一个完全二叉树,则 堆实质上是满足如下性质的完全二叉树 完全二叉树: 堆实质上是满足如下性质的完全二叉树:树中任 一非叶结点的关键字均不大于(或不小于 或不小于)其左右 一非叶结点的关键字均不大于 或不小于 其左右 孩子(若存在 结点的关键字。 若存在)结点的关键字 孩子 若存在 结点的关键字。
大根堆示例
1 87 2 78 3 53 4 45 5 65 6 09 7 31 8 17 9 23
1 87 2 78 4 45 8 17 5 65 9 23 堆顶元素值最大 6 09 3 53 7 31
小根堆示例
1 9 2 17 3 65 4 23 5 45 6 78 7 87 8 53 9 31
堆的定义
n个元素的序列 1,k2,…,kn}当且仅当满足如下关 个元素的序列{k 个元素的序列 当且仅当满足如下关 系时,称之为堆 )。若满足条件 系时,称之为堆(heap)。若满足条件(1)则 )。若满足条件( ) 大根堆(或大顶堆);若满足条件( ) );若满足条件 称大根堆(或大顶堆);若满足条件(2)则称 小根堆(或小顶堆)。 小根堆(或小顶堆)。
堆排序
堆的定义 堆的建立 堆的删除 堆排序
满二叉树
回顾
二叉树的所有分支结点都有左子树和右子树, 二叉树的所有分支结点都有左子树和右子树,并且所 有叶子结点都在二叉树的最下一层; 有叶子结点都在二叉树的最下一层;
完全二叉树 具有n个结点的完全二叉树, 前h-1层为满二叉树, 个结点的完全二叉树, 具有 个结点的完全二叉树:它的结构与满二叉树的 深度为h的完全二叉树 的完全二叉树: 层为满二叉树, 深度为 的完全二叉树 层为满二叉树 个结点的结构相同; 前n个结点的结构相同; 从左向右连续出现。 个结点的结构相同 最后一层的结点必须 的结点必须从左向右连续出现。 最后一层的结点必须从左向右连续出现
相关文档
最新文档