参考网址:http://blog.csdn.net/morewindows/article/details/6709644
public class heap {
//小顶堆
public static void main(String[] args) {
int[] arr = { 49, 38, 65, 97, 76, 13, 27, 49 };
//将元素分别插入堆中
for (int i = 0; i < arr.length; i++) {
insert(arr, i,arr[i]);
}//此时,堆已经初始化完成
//堆排序
for (int i = arr.length-1; i >0; i--){
int temp = arr[i];
arr[i] = arr[0];
arr[0] = temp;
Adjustdown(arr,0,i-1);
}
//输出排序后的数组
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
public static void swap(int a,int b){
int temp = a;
a = b;
b =temp;
}
public static void Adjustdown(int[] arr,int s,int m){//向下调整堆,删除时使用
int temp = arr[s];
int j;
for(j=2*s+1;j<=m;j=2*j+1){
if(j<m&&arr[j+1]<arr[j])++j;
if(temp <arr[j])break;
arr[s] = arr[j];
s = j;
}
arr[s] = temp;
}
public static void delete(int[] arr){
//删除堆中的节点,安定义,堆中每次都只能删除第0个数据
int len = arr.length;
swap(arr[0],arr[len-1]);
Adjustdown(arr,0,len-2);
}
public static void Adjustup(int[] arr,int i){
//向上调整堆,插入节点时使用,每次插入都是将新数据放在数组最后。
//可以发现从这个新数据的父结点到根结点必然为一个有序的数列,
//因此需自下往上调整堆
//i为数组中最后一个元素的下标
int temp = arr[i];
int j = (i-1)/2;//父节点坐标
while(j>=0 && i!=0){
if(arr[j]<temp)break;
arr[i] = arr[j];
i = j;
j = (j-1)/2;
}
arr[i]=temp;
}
public static void insert(int[] arr, int n,int num){
//在数组arr中插入节点i
arr[n]= num;
Adjustup(arr,n);
}
}