二叉树——堆排序
堆排序是指利用堆的性质,对数据进行排序。堆排序是一种高效率算法和快速排序的时间复杂度差不多。
排序分为升序和降序,本次说的是升序;
首先我们要创建一个堆,并将堆处理为最小堆(最小堆就是父亲节点的权值小于子节点的权值,最大堆则相反),由于堆的特性,最小堆的首节点的权值一定是最小值;然后我们利用这一特性可以实现对数据的排序。
#include <stdio.h>
int a[101];
int n;
void swap(int x,int y)//交换
{
int t;
t=a[x];
a[x]=a[y];
a[y]=t;
return ;
}
void siftdown(int i)//向下调整
{
int t,flag=0;
while(i*2<=n&&flag==0)
{
if(a[i]>a[i*2])
t=i*2;
else
t=i;
if(i*2+1<=n)
{
if(a[t]>a[i*2+1])
t=i*2+1;
}
if(t!=i)
{
swap(t,i);
i=t;
}
else
flag=1;
}
return ;
}
void creat()
{
int i;
for(i=n/2;i>=1;i--)
siftdown(i);
return ;
}
int deletemax()//堆排序
{
int t;
t=a[1];
a[1]=a[n];
n--;
siftdown(1);
return t;
}
int main()
{
int i,num;
scanf("%d",&num);
for(i=1;i<=num;i++)
scanf("%d",&a[i]);
n=num;
creat();//建堆
for(i=1;i<=num;i++)
printf("%d ",deletemax());
return 0;
}