zoukankan      html  css  js  c++  java
  • 算法导论:二叉堆

    1、二叉堆的定义。


    二叉堆是按照二叉树进行组织和操作的数组对象。二叉堆节点i的左儿子为节点2i,右儿子为节点2i+1,且i节点值总是大于等于它的两个儿子。

    二叉堆是数组的一部分,堆大小heap_size<=length[A],heap_size之后的数组元素不属于二叉堆。

    计算左右子节点的过程可通过移位操作来完成,且一般用宏或内联函数完成。

    2、二叉堆性质的保持:max_heapify过程(假定是最大堆)。


    过程调用形式:max_heapify(A,i),其中A为输入数组,i为节点标号。

    前提:i的左右儿子的子树都已经满足二叉堆性质。

    过程描述:将i节点的值与它的左右儿子值相比较,如果i节点值最大,说明i节点子树已经是一个二叉堆。否则,找出更大的节点,递归调用max_heapify过程(也可以使用循环来代替递归调用)。

    运行时间:左子树大小至多为2n/3(最底层半满),因此T(n)<=T(2n/3)+O(1)------>T(n)=O(lgn)

    3、建堆。


    要点:子数组A[n/2……n]中元素都是二叉树的叶子。

    过程:从二叉树的叶子节点开始使用max_heapify过程,当完成max_heapify(A,1),也即根节点调用该过程之后,整个二叉树就都满足二叉堆的性质了。

    运行时间:O(n)

    4、堆排序。


    即,将数组的元素利用二叉堆的性质进行排序。

    过程:首先,将数组建成一个二叉堆(建堆过程见3),此时最大的元素就是A[1],最小的元素就是A[n]。然后交换A[1]和A[n]的位置,从堆中删除A[n],此时的A[1]就违背了二叉堆的性质,于是调用max_heapify(A,1)来恢复二叉堆。不断重复这一过程,直到二叉堆只剩一个元素。整个删除过程就完成了升序排序。

    运行时间:O(nlgn)。

    5、C语言实现。


    待添加。

     

  • 相关阅读:
    Redis过期key是怎么样清理的?----互联网大厂面试题
    Docker容器引擎使用教程
    区块链算法
    MYSQL 常用语句与函数命令
    漏洞利用:验证绕过,XSS利用,Cookic盗用,文件上传
    小白网工入行要具备哪些基本技能?
    VMware中乌班图安装VMtools步骤
    防火墙技术原理-思维导图
    JAVA学习第一课-手工笔记
    DOS(磁盘操作系统)基本命令-思维导图
  • 原文地址:https://www.cnblogs.com/jaletech/p/3639517.html
Copyright © 2011-2022 走看看