#include<stdio.h>
//堆排序
//1.构造初建堆函数:
void sift(int R[],int low,int high)
{
//2*i为左孩子。2*i+1为右孩子
int i=low,j=2*i;
int temp=R[i];
while(j<=high)
{
//取左右孩子的最大值与父节点交换 (大顶堆的定义)
if(R[j]<R[j+1]&&j<high)
++j;//右孩子
if(temp<R[j])
{
R[i]=R[j];
i=j;
j=2*i;
}
else
break;
}
R[i]=temp;
}
//排序
void sort(int R[],int n)
{
int i;
int temp;
//建立堆次数为n/2
for(i=n/2-1;i>=0;--i)
sift(R,i,n);
//排序为n-1次
for(i=n-1;i>=1;--i)
{
temp=R[0];
R[0]=R[i];
R[i]=temp;
//交换完成后只有第一个节点不满足堆定义所以low=1,每次会减少一个需要排序元素所以为i-1
sift(R,0,i-1);
}
}
int main()
{
int i;
int R[]={12,34,98,55,49,2,4};
int n=sizeof(R)/sizeof(int);
printf("%d ",n);
//初建堆
sort(R,n);
for (i=0;i<=n;i++)
{
printf("%d ",R[i]);
}
}