什么是堆?
如果一个集合N=(n0,n1,n2,n3…n-1),把他的元素按照完全二叉树的顺序排列,
如果其父节点,总是大于其子节点,则成它为大堆,反之则为小堆。
节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
堆的性质:
堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。
给定一个数组
int []array = {1,2,3,4,5,6,7,8,9,10};
负责将其变成一个二叉树结构,再根据堆的特性,父节点总是比子节点大,因为,我们找到最后一个子节点的父节点即其下标为:(array.length-1-1)/2,然后再判断其与子节点谁大,大的值赋给父节点,然后再向下调整,知道不存在子节点,结束交换。以此类推,将每个父节点都与子节点较大的一个进行比较,直到根节点。
代码如下
public void initHeap(int[] array) {
for (int i=0;i<array.length;i++){
elem[i] = array[i];
usedSize++;
}
for (int i =(array.length-1-1)/2;i>=0;i--){
AdjustDown(i,array.length);
}
}
public void AdjustDown(int root, int len) {
int parent = root;
int child = 2 * parent + 1;
while (child < len) {
if (child + 1 < len && elem[child] < elem[child + 1]) {
++child;
}
//chile 下标存放的是左右孩最大值
if (elem[child] >elem[parent]) {
int t = elem[child];
elem[child] = elem[parent];
elem[parent] = t;
parent = child;
child = 2 * parent + 1;
} else {
break;
}
}
}
其输出结果为:10 9 7 8 5 6 3 1 4 2。
如果要建立小堆,则父节点总比子节点小,代码和大堆类似,将父节点变成较小的值即可。