为了方便,排序的时候数组从第1个开始而不是第0个
#include<stdio.h>
int left(int i){
return 2*i;}
int right(int i){
return 2*i+1;}
void heapify(int A[],int n,int j)
{ int largest;
int l=left(j);
int r=right(j);
if(l<=n&&A[l]>A[j]) largest=l;
else largest=j;
if(r<=n&&A[r]>A[largest]) largest=r;
if(largest!=j)
{int t=A[j];
A[j]=A[largest];
A[largest]=t;
heapify(A,n,largest);
}
}
void build(int A[],int n)
{
for(int i=n/2;i>=1;i--)
heapify(A,n,i);
}
void heapsort(int A[],int n)
{
build(A,n);
for(int i=n;i>=2;i--)
{
int t=A[1];
A[1]=A[i];
A[i]=t;
heapify(A,i-1,1);
}
}
int main()
{
int A[6]={0,1,6,9,4,3};
heapsort(A,5);
for(int i=1;i<=5;i++)
printf("%d ",A[i]);
}