• 最小堆排序


     堆的定义是:n个元素的序列{k1,k2,…,kn},当且仅当满足如下关系时被成为堆

        (1)Ki <= k2i 且 ki <= k2i-1        

      或 (2) Ki >= k2i 且 ki >= k2i-1 

              (i = 1,2,…[n/2])

    当满足(1)时,为最小堆,当满足(2)时,为最大堆。

      若将此序列对应的一维数组堪称是一个完全二叉树,则2i和2i+1个节点分别是节点i的左右子节点。

    如下为一个最大堆:

     

    下面以最小堆为例说明堆的输出

     

      图1为一个最小堆,当最小节点根节点13输出后,将最后一个节点97作为根节点,移到顶端,如图2. 然后要对堆进行调整。比较此完全树的根节点与其两个子节点大小,因为27 < 38 < 97,所以27是三个节点里最小的,将节点27与根节点97交换。此时以97替代27而产生的右子树为一个新的堆,再以97为根节点,对此最小堆进行调整,同理,知道要将97与49交换,得到图3的完全树。此时以97代替49为根节点的右子树为一个新堆,再对此堆做同样的操作,因为此完全树已经是最小堆,所以可以停止操作,堆的调整完毕。此时再将根节点,对的最小值输出,并进行同样的调整,可以得到如图4的新堆。这个过程被称为“筛选”。

    同样以最小堆说明堆的初始化

      从一个无序序列初始化为一个堆的过程就是一个反复“筛选”的过程。由完全二叉树的性质可以知,一个有n个节点的完全二叉树的最后一个非叶节点是节点[n/2],堆的初始化过程就从这个[n/2]节点开始。上图为如下无序数组的初始化:

        {49,38,65,97,76,13,27,50}

      首先,未处理的数组对应的堆为图1模样。从第四个节点开始([8/2]=4),因为50 < 97,故要交换两节点,交换后还要继续对其新的左子树进行类似输出后那样的筛选。易见其左子树只有节点97,已经为最佳情况,故可以继续堆的初始化,如图2。再考虑第三个节点,因为13 < 27 < 65,即节点13为当前的最小节点,故与节点65交换,并对新的左子树进行筛选,其也为最佳情况,故可继续堆的初始化,结果如图3。然后考虑第二个节点,因为38 < 50 < 76,故已经为最优情况,不用调整。最后再考虑第一个节点,根节点。因为 13 < 38 < 49,故需要将根节点49与其右孩子节点13交换,交换后还要继续对其新的右子树进行类似输出后那样的筛选,可见右子树还需要调整,因为 27 < 49 < 65,故将节点49与节点27交换。此时已经处理完了根节点,初始化结束。最终结果如图5.

  • 相关阅读:
    Python 图形化编程
    2020年全国中职学生技能大赛《网络空间安全》赛题5
    2020年全国中职学生技能大赛《网络空间安全》赛题4
    2020年全国中职学生技能大赛《网络空间安全》赛题2
    2020年全国中职学生技能大赛《网络空间安全》赛题3
    2020年全国中职学生技能大赛《网络空间安全》赛题6
    Kotlin四舍五入保留两位小数
    Centos7 安装CoreDNS
    有个同学让我帮他保留下数据
    蓝桥杯Java 特别数的和【第十届】【省赛】【B组】
  • 原文地址:https://www.cnblogs.com/767355675hutaishi/p/3753516.html
Copyright © 2020-2023  润新知