{
int j,t;
while(2*s+1
j=2*s+1;
if((j+1)
if(a[j] j++;//序号增加1,指向右子树
}
if(a[s] {
t=a[s];
a[s]=a[j];
a[j]=t;
s=j;//交换后该节点的子节点的堆结构被破坏,需要向下重新调整成堆
}
else//比较左右孩子均大则堆未被破坏,不需要再调整
break;
}
void HeapSort(int a[],int n)//堆排序
{
int t,i;
int j;
//建堆过程
for(i=n/2-1;i>=0;i--)//将a[0,n-1]建成大根堆,建堆时从第一个非叶子节点开始判断是否满足堆结构,然后进行调整
HeapAdjust(a,i,n);
//将调整好的堆的堆顶元素输出(与末尾元素交换),从根节点开始重新调整整个堆
//重复进行n-1次
for(i=n-1;i>0;i--)
{
t=a[0];//与第i个记录交换(i后面的记录已经有序),将堆顶的记录输出
a[0]=a[i];
a[i]=t;
HeapAdjust(a,0,i);//将a[0]至a[i]重新调整为堆,调整堆时由于之前已经满足堆结构,只有堆顶被破坏,所以从堆顶开始向下调整
}
}