class Test ... {//堆采用顺序表(一维数组)存储表示 public static void main(String[] args) ...{ int a[]=...{0,49,38,65,97,76,13,27,49}; HeapSort(a); for(int i=1;i<a.length;i++) System.out.print(a[i]+" "); } public static void HeapAdjust(int a[],int s,int m) ...{//已知H.r[s..m]中记录的关键字除H.r[s].key之外均满足堆的定义,本函数调整H.r[s] //的关键字,H.r[s..m]成为一个大顶堆 int rc=a[s]; int j; for(j=2*s;j<m;j*=2)...{//沿key较大的孩子结点向下筛选 if(j<m&&max(a[j],a[j+1]))++j;//j为key较大的记录的下标 if(!max(rc,a[j]))break; //rc应插入在位置s上 a[s]=a[j];s=j; } a[s]=rc; //插入 } public static void HeapSort(int a[]) ...{ //对顺序表H进行堆排序 int i; for(i=a.length/2;i>=1;--i) //把H.r[1..H.length]建成大顶堆 HeapAdjust(a,i,a.length-1); for(i=a.length-1;i>=1;--i) ...{ int tmp=a[1]; //将堆顶记录和当前未经排序子序列Hr[1..i]中 a[1]=a[i]; //最后一个记录相互交换 a[i]=tmp; HeapAdjust(a,1,i-1); //将H.r[1..i-1]重新调整为大顶堆 } } public static boolean max(int a,int b) ...{ return a>b; }}