堆排序和快速排序的类似,堆排序主要通过完全二叉树或者是近似完全二叉树,然后移走堆顶元素,重新建堆,重复操作就是了;
#include<stdio.h>
void siftheap(int r[],int k,int n) //大根堆的实现
{
int i,j,temp;
i=k;j=2*i+1; //置i为要筛的节点,j为i的左孩子
while(j<n) //筛选还没有进行的叶子
{
if(j<n-1&&r[j]<r[j+1]) j++; //比较i的左右孩子,j为较大的
if(r[i]>r[j]) break; //根节点已经大于左右孩子中的较大者
else
{
temp=r[i];r[i]=r[j];r[j]=temp; //将筛选的节点与j交换
i=j;j=2*i+1; //被筛选节点位于原来节点j的位置
}
}
}
void heapsort(int r[],int n) //堆排序
{
int i,temp;
for(i=(n-1)/2;i>=0;i--) //初始建堆最后一个下标是(n-1)/2
{
siftheap(r,i,n);
}
for(i=1;i<=n-1;i++) //重复执行移走的堆顶和同时重建堆得操作
{
temp=r[0];r[0]=r[n-i];r[n-i]=temp;
siftheap(r,0,n-i); //只需调整根节点
}
}
int main()
{
int r[]={9,2,5,6,0,4,3,8,1,7};
heapsort(r,10);
printf("排序后的结果:");
for(int i=0;i<10;i++)
{
printf("%3d",r[i]);
}
printf("\n");
}