首先是构造最大堆(最小堆,排序结果刚好相反具体有一些改动)书中证明了从第N/2开始即可构造出最大堆
void max_heap(int a[],int i)
{
int l=2*i+1,r=2*i+2,largest;
if(l<=heap_size && a[l]>a[i])//在左右子节点和本身中找到最大的作为跟节点
{
largest=l;
}
else
{
largest=i;
}
if(r<=heap_size && a[r]>a[largest])
{
largest=r;
}
if(largest != i)
{
swap(&a[largest],&a[i]);
max_heap(a,largest);
}
}
void build_max_heap(int a[])
{
int i,length=(heap_size)/2;
for(i=length; i>=0; i--)
max_heap(a,i);
}
最后所有元素按顺序放在了数组里面
void heap_sort(int a[])
{
int i=MAX-1;
build_max_heap(a);
for(i=MAX-1;i>=1;i--)//最后一个数据不用排列已经是最小的了且在第一个位置上
{
swap(&a[i],&a[0]);
heap_size--;
max_heap(a,0);
}
}
#include <stdio.h>
#define MAX 10
int heap_size;
int main(void)
{
int a[MAX]={4,1,3,2,16,9,10,14,8,7};
print_array(a);
heap_size=MAX-1;
heap_sort(a);
print_array(a);
getchar();
return 1;
}