Pagini recente » Cod sursa (job #1213535) | Cod sursa (job #221420) | Cod sursa (job #2518325) | Cod sursa (job #1740833) | Cod sursa (job #253527)
Cod sursa(job #253527)
#include<stdio.h>
#define N 500010
int h[N];
int n1,n;
inline void swap(int &x,int &y)
{
int aux=x;
x=y;
y=aux;
}
inline int left_son(int x)
{
return x<<1;
}
inline int right_son(int x)
{
return (x<<1)+1;
}
inline int father(int x)
{
return x>>1;
}
void upheap(int k)
{
int key=h[k];
while(k>1 && key>h[father(k)])
{
h[k]=h[father(k)];
k=father(k);
}
h[k]=key;
}
void downheap(int k)
{
int son;
do
{
son=0;
if(left_son(k)<=n1)
{
son=left_son(k);
if(right_son(k)<=n1 && h[son]<h[right_son(k)])
son=right_son(k);
if(h[son]<=h[k])
son=0;
}
if(son)
{
swap(h[k],h[son]);
k=son;
}
}while(son);
}
inline void citire()
{
scanf("%d",&n);
for(n1=1; n1<=n; ++n1)
{
scanf("%d",&h[n1]);
upheap(n1);
}
}
inline void heap_sort()
{
--n1;
while(n1>1)
{
swap(h[1],h[n1]);
--n1;
downheap(1);
}
}
inline void scrie()
{
for(int i=1; i<n; ++i)
printf("%d ",h[i]);
printf("%d\n",h[n]);
}
int main()
{
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
citire();
heap_sort();
scrie();
return 0;
}