public class HeapSortTest
{
public static void heapSort(int[] a){
for(int i=a.length/2;i>0;i--){//i值的变化是对数据的编号从1开始,
//与java语言中定义数组的下标对应是顶端编号不满足二叉树的定义
heapAdjust(a,i,a.length);//对以个数组中的所有数据进行大顶堆的排列
}
//还有一个交换函数
for(int l=a.length;l>1;l--){
swap(a,0,l-1);//交换第一个数和最后一个数
heapAdjust(a,1,l-1);
}
}
public static void heapAdjust(int[] a,int i,int l){//1 (a,4,a.length)
int temp = a[i-1];//所有的标号都为现有标号减1
for(int s=i*2;s<l;s*=2){
if(s<l&&a[s-1]<a[s]){
++s;
}
if(temp>a[s-1]){
break;
}
a[i-1]=a[s-1];
i=s;
}
a[i-1]=temp;
}
//----------------------------------------------------------------------
public static void swap(int[] a,int i,int j){
int temp =a[i];
a[i]=a[j];
a[j]=temp;
}
//----------------------------------------------------------------------
public static void main(String[] args)
{
int[] b=new int[]{9,1,5,8,3,7,4,6,2,12,22,14,16,34,100,17,23,56,140,0,11};
int[] a=new int[]{50,10,90,30,70,40,80,60,20,100};
HeapSortTest.heapSort(a);
HeapSortTest.heapSort(b);
for(int elem:a)
System.out.print(elem+" ");
System.out.println();
for(int elem:b)
System.out.print(elem+" ");
}
}