class HeapSort{
void headAdjust(int[] a,int k,int len){
a[0] = a[k];//暂存子树的根节点
for (int i = 2*k; i <= len ; i*=2) {//沿关键字较大的子节点向下筛选
if (i < len && a[i] <a[i+1])
i++;//取关键字较大的子节点的下标
if(a[0] >= a[i])//筛选结束
break;
else {
a[k] = a[i];//将a[i]调整到双亲节点上
k = i;//修改K值,以便向下筛选
}
}
a[k] =a[0]; //被筛选节点的值放入最终位置
}
//建立大根堆
void buildMaxHead(int[] a,int len){
for (int i = len/2 ; i>0 ; i--)//从后往前调整分支节点
headAdjust(a,i,len);
}
public void sort(int[] a){
buildMaxHead(a,a.length-1);//初始建堆
for (int i = a.length-1; i >1 ; i--) {//n-1趟交换和建堆过程
int temp = a[i]; //堆底元素和堆顶元素交换
a[i] = a[1];
a[1] = temp;
headAdjust(a,1,i-1);//把剩余待排序的元素建成堆
}
}
}