1. 对于堆, 结点I的左子2*i +1 右子2*i + 2
2. 对于n的堆, 第一个非叶子结点是n/2 - 1, 考虑到数组是从0开始的, 最后一个结点是n-1, 第一个是0
3. 删除和添加是在AdjustHeap()的基础上实现的
#include<stdio.h>
void swap(int *a, int *b)
{
int tem = *a;
*a = *b;
*b = tem;
}
void AdjustHeap(int *ar, int parent, int n)
{
if(n==1||parent>n/2-1)
return;
int left = 2*parent+1;
int right = 2*parent+2;
if(right<=n-1)
{
if(ar[parent]>=ar[left]&&ar[parent]>=ar[right])
return;
else
{
if(ar[left]>ar[parent]&&ar[left]>=ar[right])
{
swap(&ar[left],&ar[parent]);
AdjustHeap(ar,left,n);
}
if(ar[right]>ar[parent]&&ar[right]>=ar[left])
{
swap(&ar[right],&ar[parent]);
AdjustHeap(ar,right,n);
}
}
}
else
{
if(ar[parent]>=ar[left])
return;
else
{
swap(&ar[parent],&ar[left]);
AdjustHeap(ar,left,n);
}
}
}
void HeapSort(int *ar, int n)
{
int i;
for(i=n/2-1;i>=0;i--)
AdjustHeap(ar,i,n);
for(i=n-1;i>0;i--)
{
swap(&ar[0], &ar[i]);
AdjustHeap(ar,0,i);
}
}
int main()
{
int n;
int a[100];
while(~scanf("%d",&n))
{
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
HeapSort(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n ");
}
return 0;
}