public class Main {
//大根堆算法
public static void main(String[] args) {
int []array = new int[]{0,53,17,78,9,45,65,87,32};//用a[0]=0是为了使用规则:某一个节点的序号/2,是其父母节点的序号。
for(int i=array.length/2;i>=1;i--){//从最后一个节点的双亲节点开始
rush(array,i,array.length);
}
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
}
public static void rush(int a[],int x,int length){
int temp=a[x];//找一个值记录节点值
for(int i=2*x;i<=length;i=2*i){
if(i+1<length&&a[i]<a[i+1]){//子节点找到大的那个孩子的下标位置
i++;
}
if(temp>=a[i]){
break;//如果父母节点大于子节点就没必要再继续下去
}
if(temp<a[i]){
a[x]=a[i];
a[i] = temp;
x=i;
}
}
}
}