最大堆:(数组从0开始记)
模板:
#include <bits/stdc++.h>
using namespace std;
int n;
int h[501];
int arr[501];//记录堆顶元素
int cnt;
void shifdown(int i)
{
int flag=0;
int t;
while(i*2+1<=n-1&&!flag)//他有儿子并且他还可以继续向下
{
if(h[i]<h[2*i+1])
{
t=2*i+1;
}
else
{
t=i;
}
if(2*i+2<=n-1)
{
//如果他有右儿子
if(h[t]<h[2*i+2])
{
t=2*i+2;
}
}
if(t!=i)
{
swap(h[t],h[i]);
i=t;
}
else
{
flag=1;//不需要再向下调整
}
}
}
void creat()//建立堆的函数
{
int i;
for(i=n/2;i>=0;i--)
{
shifdown(i);
}
return;
}
void heapsort()//堆排序(最大堆),不断找最大的过程
{
while(n>0)
{
arr[cnt++]=h[0];//记录最大堆堆顶
swap(h[0],h[n-1]);//交换堆顶和最后一个元素的值,并将堆顶删除
n--;//删除堆顶
shifdown(0);//向下调整
}
}
int main()
{
cin>>n;
int i;
for(i=0;i<n;i++)
{
cin>>h[i];
}
creat();
heapsort();
for(i=0;i<cnt;i++)
{
cout<<arr[i]<<endl;
}
return 0;
}