题目大意:
输入n个数,要求用堆排序输出从小到大排完序后的结果。
解题思路:
一开始用up(上移)建堆,然后输出根节点,然后赋值一个足以让它下移到最后的值,然后不管它,直到节点数=0
#include<bits/stdc++.h>
#define INF 21474836480
using namespace std;
long long n,a[500001],x,y,sum,m,p;
void up(int x)//上移操作
{
while(x>1&&a[x]<a[x/2])
{
swap(a[x],a[x/2]);
x/=2;
}
}
void down(int x)//下移操作
{
int y=x*2;
while ((y<=n&&a[y]<a[x])||(y+1<=n&&a[y+1]<=a[x]))
{
if (a[y]>a[y+1]&&y<n) y++;
swap(a[y],a[x]);
x=y; y=x*2;
}
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]),up(i);//建堆
while(n>0)
{
printf("%d\n",a[1]);//每次输出根节点
a[1]=a[n]; n--; down(1);//down就是下移操作,把根节点下移到最后
//然后n-1就是不管这个已经输出了的根节点
}
return 0;
}