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语言实现。


    待添加。

     

  • 相关阅读:
    【BigData】Java基础_ArrayList的使用
    【BigData】Java基础_构造方法的使用
    【BigData】Java基础_类和对象的基本使用
    【BigData】Java基础_冒泡排序
    【BigData】Java基础_数组
    【BigData】Java基础_循环
    【BigData】Java基础_终端输入2个数字并求和
    Navicat自动断开连接处理方式
    名字修饰约定extern "C"与extern "C++"浅析
    qt study 元对象,属性和反射编程
  • 原文地址:https://www.cnblogs.com/jaletech/p/3639517.html
Copyright © 2011-2022 走看看