1 堆(heap)的简单介绍
堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:a. 堆中某个节点的值总是不大于或不小于其父节点的值;
b. 堆总是一棵完全二叉树。
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。
堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2)
若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终端结点的值均不大于(或不小于)其左、右孩子结点的值。由此,若序列{k1,k2,…,kn}是堆,则堆顶元素(或完全二叉树的根)必为序列中n个元素的最小值(或最大值)。(摘自百度百科:堆)
2 最大堆的Java实现
最大堆和最小堆的实现类似,这里只介绍了最大堆的实现,关于堆排序的内容,在后续的博文中会单独介绍。
package Binary_Tree_Study;
/**
* Created by Administrator on 2018/5/21.
*/
public class MaxHeap {
private int[] array;//基于堆的完全二叉树
private int N = 0;//存储在array[1...N]中,array[0]没有使用
private int maxN;//堆的容量
public MaxHeap(int maxN) {
this.maxN = maxN;
this.array = new int[maxN+1];
}
//堆是否为空
public boolean isEmpty() {
return N == 0;
}
//获取堆的大小
public int size() {
return N;
}
//堆是否已满
public boolean isFull() {
return N == maxN;
}
//插入操作
public void insert(int v) {
if(isFull()) {
System.out.println("最大堆已满");
return;
}
array[++N] = v;
swim(N);
}
//删除最大元素
public int delMax(){
if(isEmpty()) {
System.out.println("最大堆已空");
return array[0];
}
int max = array[1];//从根节点得到最大元素
exch(1,N--);//将其与最后一个结点交换
sink(1);//恢复堆的有序性
return max;
}
//辅助方法
//比较i是否小于j
private boolean less(int i, int j) {
if((array[i] -array[j]) < 0)
return true;
else
return false;
}
//交换元素
private void exch(int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
//上浮操作
private void swim(int k) {
while (k > 1 && less(k/2, k)) {
exch(k/2, k);
k = k/2;
}
}
//下沉操作
private void sink(int k) {
while (2*k <= N) {
int j = 2*k;
if(j < N && less(j, j+1))
j++;
if(!less(k, j))
break;
exch(k, j);
k = j;
}
}
}
3 参考资料
[1] 算法第四版 - 算法
[2] 数据结构与算法经典问题解析
[3] 数据结构与算法分析 c语言描述
后记:
后续看了一些博文,感觉写得挺不错的,在此备注一下,以便以后查阅。
2. 基本数据结构――堆的基本概念及其操作 6. 堆树(最大堆、最小堆)详解