堆:是一种特殊的完全二叉树,分为大根堆和小根堆,顾名思义,根节点的值比孩子结点的值大的就是大根堆,反之则为小根堆。
此例要实现的功能就是输入n个正整数,将其排列输出小根堆
eg.输入:
14
99 5 36 7 22 17 46 12 2 19 25 28 1 92
输出:1 2 17 5 19 28 46 12 7 22 25 99 36 92
代码:
package pat;
import java.util.Scanner;
public class ReadNum {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int n=cin.nextInt(); //输入节点的个数
int a[]=new int[n+1];
for(int i=1;i<=n;i++){
a[i]=cin.nextInt(); //按顺序保存节点到a数组
}
cin.close();
int i;
for(i=n/2;i>=1;i--){ //从叶子节点开始向上调整
int t,flag=0;
while(i*2<=n&&flag==0){ //有左孩子并且需要向上调整时
if(a[i]>a[i*2]) //根节点大时把左孩子的编号赋给t
t=2*i;
else //根节点小时把根结点的编号赋给t
t=i;
if(2*i+1<=n){ //当有有孩子并且根节点大于右孩子时把有孩子的编号赋给t
if(a[t]>a[2*i+1])
t=2*i+1;
}
if(t!=i){ //只有当根节点的编号发生改变时交换
int temp;
temp=a[i];
a[i]=a[t];
a[t]=temp;
i=t; //把左孩子或者右孩子的编号给i,继续执行while
}
else flag=1; //否则跳出while循环
}
}
for(int k=1;k
System.out.print(a[k]+" ");
}
}
}