了解大根堆的原理,利用递归寻找最大值,并令最大值成为数组末尾(末尾逐渐缩小)位置,每次操作末尾size减小一
#include<stdio.h>
int a[100];
void Exchange(int i,int n)//将最大叶子结点与根结点交换或者大根堆的最大值与数组尾部数字交换
{
int t;
t=a[i];
a[i]=a[n];
a[n]=t;
}
void heapsort(int n)
{
if(n == 2)
{//当只剩两个的时候,直接比较大小 先输出最大的 然后输出最小的
if(a[0] > a[1])
{
Exchange(0,n-1);
}
return ;
}
int i;
for(i = n/2-1;i >= 0; i--) //比较每一个根结点与其叶子结点的大小 并且将大于根结点的叶子结点与根结点交换
{//最后一个根结点是第n/2个 但是第一个数下标为0 所以最后一个根结点下标为n/2-1
if(a[2*i+1] > a[i] && 2*i+1 < n)//与左孩子进行比较
Exchange(i,2*i+1);
if(a[2*i+2] > a[i] && 2*i+2 < n)//与右孩子进行比较
Exchange(i,2*i+2);
}//形成大根堆且因为每次交换都打乱大根堆结构,因此要多次
Exchange(0,n-1);
heapsort(n-1);//将是输出的结点弹出
}
int main()
{
int n,j;
scanf("%d",&n);
for( j =0; j <n; j++)
{
scanf("%d",&a[j]);
}
heapsort(n);
for(j=0;j<n;j++)
{
printf("%d",a[j]);
}
return 0;
}