Pagini recente » Borderou de evaluare (job #1080711) | Cod sursa (job #3207346) | Borderou de evaluare (job #2367863) | Borderou de evaluare (job #2904480) | Cod sursa (job #601202)
Cod sursa(job #601202)
#include <cstdio>
int v[500002] , n;
void swap(int k,int t)
{
int x = v[t];
v[t] = v[k];
v[k] = x;
}
void HeapUp(int k)
{
if(k<=0) return;
int t = (k-1)/2;
if(v[k]>v[t])
{
swap(k,t);
HeapUp(t);
}
}
void BuildH(int k)
{
for(int i=1;i<k;++i) HeapUp(i);
}
void HeapDw(int r,int k)
{int St, Dr , i;
if(2*r+1<=k)
{
St = v[2*r+1];
if(2*r+2<=k) Dr = v[2*r+2];
else Dr = St - 1;
if(St>Dr) i = 2*r+1;
else i = 2*r+2;
if(v[r]<v[i])
swap(r,i) ,
HeapDw(i,k);
}
}
void HeapSort(int k)
{
while(k>0)
swap(0,k) , k-- , HeapDw(0,k);
}
int main()
{
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%d",&v[i]);
BuildH(n);
HeapSort(n-1);
for(int i=0;i<n;++i)
printf("%d ", v[i]);
return 0;
}