void heapsort(int n, int ar[])
{
int i;
int heap_size = n;
build_max_heap(n,ar);
for(i=n-1;i>=1;i--)
{
int temp;
temp = ar[0];
ar[0] =ar[i];
ar[i] = temp;
heap_size--;
max_heapify(ar,0,heap_size);
}
}
void max_heapify(int ar[],int i,int heap_size)
{
int largest; //小堆的最大值的索引
int l = left(i);
int r = right(i);
if(lar[i]) //左孩子大于父亲
largest = l;
else if(rar[i]) //右孩子大于父亲
largest = r;
else //父亲最大
largest = i;
if(largest != i) //需要发生值的交换
{
int temp = ar[i];
ar[i] = ar[largest];
ar[largest] = temp;
max_heapify(ar,largest,heap_size);
}
}
void build_max_heap(int n, int ar[])
{
int heap_size = n;
int i;
for(i=heap_size/2-1;i>=0;i--)
max_heapify(ar,i,heap_size);
}
int left(int i)
{
return 2*i;
}
int right(int i)
{
return 2*i+1;
}