1.什么是堆
堆是一棵具有特定性质的二叉树,堆的基本要求是堆中所有结点的值必须大于等于(或小于等于)其孩子结点的值,这也称为堆的性质。堆还有另一个性质,就是当h>0时,所有叶子结点都处于第h或h-1层,也就是说,堆应该是一棵完全二叉树。
2.堆的类型
最大堆:结点的值必须大于等于其孩子结点的值
最小堆:结点的值必须小于等于其孩子结点的值
3.二叉最大堆的实现
堆化元素
堆化是堆最重要的操作,当插入或删除堆的一个元素时,有可能使堆不满足堆的性质,在这种情况下,需要调整堆中元素的位置使之重新变为堆,这个过程叫做堆化。在最大堆中,要堆化一个元素,需要找到它的孩子结点中的最大值,然后将它与当前元素交换,重复该过程直至每个结点都满足堆的性质为止。
Java版本实现
package com.wuyi.notecode.sort;
public class Heap {
public int[] nums;
public int count;//堆中元素个数
public int size;//堆的大小
public Heap(int size ) {
this.size = size;
count = 0;
nums = new int[size];
}
//获取父节点
public int Parent(int i) {
if(i <= 0 || i > this.count)
return -1;
return( i - 1 ) / 2;
}
//获取左孩子
public int LeftChild(int i) {
int l = 2 * i +1;
if(l <= 0 || l > this.count - 1)
return -1;
return l;
}
//获取右孩子
public int RightChild(