Pagini recente » Cod sursa (job #1994399) | Cod sursa (job #1076370) | Cod sursa (job #1765922) | Cod sursa (job #1052831) | Cod sursa (job #1232875)
#include <cstdio>
#include <algorithm>
using namespace std;
int i,n,H[500010],a[500010];
inline void HeapUp(int k)
{
int t;
if (k<=1) return;
t=k/2;
if (H[k]>H[t])
{
swap(H[k],H[t]);
HeapUp(t);
}
}
inline void BuildH(int nr)
{
int i;
for (i=1;i<=nr;++i)
HeapUp(i);
}
inline void HeapDown(int r,int k)
{
int St,Dr,i;
if (2*r<=k)
{
St=H[2*r];
if (2*r+1<=k) Dr=H[2*r+1];
else Dr=St-1;
if (St>Dr) i=2*r;
else i=2*r+1;
if (H[r]<H[i])
{
swap(H[r],H[i]);
HeapDown(i,k);
}
}
}
int main()
{
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
scanf("%d", &n);
for (i=1;i<=n;++i) scanf("%d", &H[i]);
BuildH(n);
for (i=n;i>1;--i)
{
swap(H[1],H[i]);
HeapDown(1,i-1);
}
for (i=1;i<=n;++i) printf("%d ", H[i]);
return 0;
}