#include <stdio.h>
void heap_sort();
void max_heap();
void build_heap();
int LEFT(),RIGHT();
int length;
int main(){
int a[]={4,1,3,2,16,9,10,14,8,7};
length=sizeof(a)/sizeof(a[0]);
int len=length;
int i;
printf("before:\t");
for(i=0;i<len;i++){
printf("%d ",a[i]);
}
heap_sort(a);
printf("\nafter:\t");
for(i=0;i<len;i++){
printf("%d ",a[i]);
}
getchar();
}
void heap_sort(int A[]){
build_heap(A);
while(length>=2){
//exchange root and last leaf
int temp=A[0];
A[0]=A[length-1];
A[length-1]=temp;
//length <- length-1
length--;
max_heap(A,0);
}
}
//generate max heap
void max_heap(int A[],int i){
int left=LEFT(i);
int right = RIGHT(i);
int largest=i;
if(A[i]<A[left]&&left<=length-1) largest=left;
if(A[right]>A[largest]&&right<=length-1) largest=right;
if(i!=largest){
int temp=A[i];
A[i]=A[largest];
A[largest]=temp;
max_heap(A,largest);
}
}
void build_heap(int A[]){
int i;
for(i=length/2-1;i>=0;i--){
max_heap(A,i);
}
}
int LEFT(i){
return i*2+1;
}
int RIGHT(i){
return i*2+2;
}