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(" "); } return 0; }