#include <stdio.h>
#include <stdlib.h>
int left(int i)//返回左孩子位置
{
return 2*i;
}
int right(int i)//返回右孩子位置
{
return 2*i+1;
}
void min_heapify(int *a,int heap_size,int i)//保持堆性质,使以i为根的子树成为最小堆 ,heap_size当前堆中元素数量
{
int l,r,least;
int temp;
l=left(i);
r=right(i);
if(l<=heap_size&&a[l]<a[i])
least=l;
else
least=i;
if(r<=heap_size&&a[r]<a[least])
least=r;
if(least!=i)
{
temp=a[i];
a[i]=a[least];
a[least]=temp;
min_heapify(a,heap_size,least);
}
}
void build_min_heap(int *a,int length)//建立最小堆
{
int i,heap_size;
for(i=length/2;i>=1;i--)
min_heapify(a,length,i);
}
void heap_sort2(int *a,int length)//堆排序,从大到小 ,length为堆中元素数量
{
int heap_size=length;
int i,temp;
build_min_heap(a,length);//建立最小堆
for(i=length;i>=2;i--)
{
temp=a[i];
a[i]=a[1];
a[1]=temp;
heap_size--;
min_heapify(a,heap_size,1);//重新调整为最小堆
}
}
int main(int argc, char *argv[])
{
// int a[11]={0,4,1,3,2,16,9,10,14,8,7};//测试数据
//int length=10;
int length;//数组中的堆的数据的长度
int a[100];
a[0]=0;
int i;
printf("请输入元素的数量:");
scanf("%d",&length);
printf("\n请依次输入%d个元素,空格结束:\n",length);
for(i=1;i<=length;i++)
scanf("%d",&a[i]);
printf("\n");
for(i=1;i<=length;i++)
printf("%d ",a[i]);
printf("\n------------------------\n");
printf("建立最小堆以后\n");
build_min_heap(a,length);
for(i=1;i<=length;i++)
printf("%d ",a[i]);
printf("\n");
printf("使用堆排序后:\n");
heap_sort2(a,length);
for(i=1;i<=length;i++)
printf("%d ",a[i]);
system("PAUSE");
return 0;
}