天天看点

最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)

堆有最大堆和最小堆之分,最大堆就是每个节点的值都>=其左右孩子(如果有的话)值的完全二叉树。最小堆便是每个节点的值都<=其左右孩子值的完全二叉树。 

  设有n个元素的序列{k1,k2,...,kn},当且仅当满足下列关系时,称之为堆。 

堆的三种基本操作(以下以最大堆为例): 

⑴最大堆的插入   

    由于需要维持完全二叉树的形态,需要先将要插入的结点x放在最底层的最右边,插入后满 足完全二叉树的特点; 

  然后把x依次向上调整到合适位置满足堆的性质,例如下图中插入80,先将80放在最后,然后两次上浮到合适位置. 

  时间:O(logn)。  “结点上浮” 

程序实现: 

最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)

View Code

⑵删除 

   操作原理是:当删除节点的数值时,原来的位置就会出现一个孔,填充这个孔的方法就是, 

把最后的叶子的值赋给该孔并下调到合适位置,最后把该叶子删除。 

如图中要删除72,先用堆中最后一个元素来35替换72,再将35下沉到合适位置,最后将叶子节点删除。 

   “结点下沉” 

程序:

最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)

⑶初始化 

方法1:插入法: 

  从空堆开始,依次插入每一个结点,直到所有的结点全部插入到堆为止。 

  时间:O(n*log(n)) 

  方法2:调整法: 

    序列对应一个完全二叉树;从最后一个分支结点(n div 2)开始,到根(1)为止,依次对每个分支结点进行调整(下沉),

以便形成以每个分支结点为根的堆,当最后对树根结点进行调整后,整个树就变成了一个堆。 

  时间:O(n) 

对如图的序列,要使其成为堆,我们从最后一个分支结点(10/2),其值为72开始,依次对每个分支节点53,18,36 45进行调整(下沉). 

最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)

(4)最大堆排序  

最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)

 (5)完整的代码

最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)

转自:http://www.java3z.com/cwbwebhome/article/article1/1362.html?id=4745