Pagini recente » Infoarena Monthly 2012 - Runda 6 - Solutii | Istoria paginii utilizator/nicoleta_iancu | Cod sursa (job #2006779) | Cod sursa (job #2016980) | Cod sursa (job #495440)
Cod sursa(job #495440)
#include <stdio.h>
const int maxn=500001;
long int v[maxn];
int i,N;
void swap(long int *a,long int *b)
{
long int aux;
aux=*a;
*a=*b;
*b=aux;
}
void upheap(int k)
{
while(k>1 && v[k]>v[k/2])
{
swap(&v[k],&v[k/2]);
k/=2;
}
}
void downheap(int k,int nr)
{
int son;
do
{
son=0;
if(2*k<=nr)
{
son=2*k;
if(2*k+1<=nr && v[son]<v[2*k+1])
son=2*k+1;
if(v[son]<v[k]) son=0;
}
if(son)
{
swap(&v[k],&v[son]);
k=son;
}
}
while(son);
}
int main()
{
int hp;
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
scanf("%d",&N);
for(i=1;i<=N;i++) scanf("%ld ",&v[i]);
for(i=N/2;i>0;i--) downheap(i,N);
hp=N;
while(hp)
{
swap(&v[1],&v[hp]);
hp--;
downheap(1,hp);
}
for(i=1;i<=N;i++) printf("%ld ",v[i]);
}