#include<iostream>
#include<cstdio>
using namespace std;
int h[10010];
int n;
void swap(int x,int y)//交换下标为x和y的两个数
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
return;
}
void siftdown(int i) //向下调整,大的在上,建立最大堆
{
int t,flag=0;
while(i*2<=n&&flag==0)
{
if(h[i]<h[i*2])
t=i*2;
else
t=i;
if(i*2+1<=n)
{
if(h[t]<h[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=h[1];
// h[1]=h[n];
// n--;
// //printf("n==%d\n",n);
// siftdown(1);
// return t;
//}
void headsort()//堆排序 从小到大
{
while(n>1)
{
swap(1,n);//把最大的换到后面,然后向下调整为最大堆,继续重复
n--;
siftdown(1);
}
return;
}
int main(void)
{
int i,num;
scanf("%d",&n); //输入要排序的元素数量
num=n; //num是必须的
for(i=1;i<=n;i++)
scanf("%d",&h[i]);
creat();
headsort();
for(i=1;i<=num;i++)
printf("%d ",h[i]);
return 0;
}
//测试数据 14 99 5 36 7 22 17 46 12 2 19 25 28 1 92
堆排序代码
最新推荐文章于 2022-07-03 20:27:36 发布