print?void HeapAdjust(int a[],int s,int n)//construct heap
{
int j,t;
while(2*s+1<n)//是否存在左子樹
{
j=2*s+1;
if((j+1)<n)
{
if(a[j]<a[j+1])//左子樹小於右子樹,則需要比較右子樹
j++;//序號增加1,指向右子樹
}
if(a[s]<a[j])//比較s與j為序號的數據
{
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]重新調整為堆,調整堆時由於之前已經滿足堆結構,只有堆頂被破壞,所以從堆頂開始向下調整
}
}