Pagini recente » Cod sursa (job #741339) | Cod sursa (job #381001) | Cod sursa (job #773471) | Cod sursa (job #2773217) | Cod sursa (job #745287)
Cod sursa(job #745287)
#include<cstdio>
#define NMAX 500005
using namespace std;
int H[NMAX],N;
inline int left_son(int nod)
{
return nod<<1;
}
inline int right_son(int nod)
{
return (nod<<1)+1;
}
void swap(int i, int j)
{
int aux;
aux=H[i];
H[i]=H[j];
H[j]=aux;
}
void sift(int n, int i)
{
int son;
do
{
son=0;
if(left_son(i)<=n)
{
son=left_son(i);
if(right_son(i)<=n && H[son]<H[right_son(i)])
son=right_son(i);
if(H[son]<H[i])
son=0;
}
if(son)
swap(i,son);
i=son;
}while(son);
}
void construct_heap(int n)
{
int i;
for(i=n/2;i;i--)
sift(n,i);
}
void citire()
{
freopen("algsort.in","r",stdin);
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d",&H[i]);
}
void afisare()
{
freopen("algsort.out","w",stdout);
for(int i=1;i<=N;i++)
printf("%d ",H[i]);
printf("\n");
}
void BVO()
{
construct_heap(N);
for(int i=N;i>=2;i--)
{
swap(1,i);
sift(i-1,1);
}
}
int main()
{
citire();
BVO();
afisare();
return 0;
}