一、堆
1. 堆的概念
堆实际是在完全二叉树的基础上进行了一些调整。假设我们有一个集合 K={k0, k1, k2, ..., kn-1},我们将 K 中所有的元素按完全二叉树的顺序存储方式存储在一个一维数组中,此时我们分为大根堆和小根堆两种堆。
大根堆
当 Ki >= K2i+1 且 Ki >= K2i+2(这里的 ki 指的是元素,i 指的是下标)那么此时的堆就是一个大根堆。
小根堆
当 Ki <= K2i+1 且 Ki <= K2i+2(这里的 ki 指的是元素,i 指的是下标)那么此时的堆就是一个小根堆。
总结:堆的性质
堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。
2. 堆的创建
通过上述我们已经知道了堆是什么,那么我们现在来手动创建一个堆。
2.1 小根堆
小根堆实现原理:通过不断的向下调整保证堆的性质。
代码实现:
public class MyHeap {
// 首先我们堆底层是一个数组实现的
int[] elem;
// 需要一个变量记录有效元素个数
int usedSize;
// 构造方法
public MyHeap() {
// 这里我们给数组初始空间设置为 10
elem = new int[10];
}
// 初始化数组中的值
public void create(int[] array) {
for (int i = 0; i < array.length; i++) {
elem[usedSize++] = array[i];
}
}
// 将数组调整为小根堆 (向下调整)
public void createDown() {
for (int parent = (usedSize - - ) / ; parent >= ; parent--) {
siftDown(parent, usedSize);
}
}
{
parent * + ;
(child < usedSize) {
(child + < usedSize && elem[child] > elem[child + ]) {
child++;
}
(elem[child] < elem[parent]) {
swap(child, parent);
parent = child;
child = parent * + ;
} {
;
}
}
}
{
elem[i];
elem[i] = elem[j];
elem[j] = tmp;
}
}


