public class TestHeap {
//整体思路框架
//1.拿来一个数组构建大根堆的时候,我们是从最小的一棵树的父亲节点开始的(即(usedSize-1-1)/2),将节点向下调整
//2.但是对于整个堆来说是从下网上调整的
//要点:如何找最后一棵子树的根节点;如何找左右子孩子(且保证找到的子孩子满足大根堆的交换条件);如何判断已经交换完了;
public int elem[];
public int useSize;
public static final int Defaut_Number = 10;
public TestHeap() {
elem = new int[Defaut_Number];
}
//对elem进行初始化
public void initElem(int[] array) {
for (int i = 0; i < array.length; i++) {
elem[i] = array[i];
useSize++;
}
}
//开始对堆的创建
public void creatTree(){
for (int parent = (useSize-1-1)/2; parent >=0 ; parent--) {
shiftDown(parent,useSize);
}
}
public void shiftDown(int parent,int usedSize){
int child = 2*parent+1;
//保证有左孩子的
while (child<usedSize){
//保证有又孩子的
if(child+1<usedSize&&elem[child]<elem[child+1]){
child++;
}
//上述走完后,确保拿到的子孩子是最大值
if (elem[parent]<elem[child]){
int temp = elem[parent];
elem[parent] = elem[child];
elem[child] = temp;
parent = child;
child = 2*parent+1;
}else {
break;
}
}
return;
}
}