Pagini recente » Cod sursa (job #1621265) | Cod sursa (job #747413) | Cod sursa (job #1664922) | Cod sursa (job #2428388) | Cod sursa (job #349295)
Cod sursa(job #349295)
#include <stdio.h>
typedef long long big;
typedef unsigned uint;
#define nmax 500001
uint n;
big H[nmax];
void swap(big &x,big &y)
{
big ax=x;
x=y;
y=ax;
}
inline uint lson(uint x)
{
return 2*x;
}
inline uint rson(uint x)
{
return 2*x+1;
}
inline uint father(uint x)
{
return x/2;
}
void up_up(big H[],int k,uint n)
{
bool ok=1;
do
{
ok=0;
if(k>1&&H[father(k)]>H[k])
{
ok=1;
swap(H[father(k)],H[k]);
}
if(ok)
{
k=father(k);
}
}while(ok);
}
void down(big H[],int k,uint n)
{
uint son=1;
while(son)
{
if(lson(k)<=n)
{
son=lson(k);
if(rson(k)<=n&&H[rson(k)]<H[lson(k)])
{
son=rson(k);
}
if(H[k]<=H[son])
son=0;
if(son)
{
swap(H[k],H[son]);
k=son;
}
}
else break;
}
/*do
{
son=0;
if(lson(k)<=n)
{
if(rson(k)<=n&&H[rson(k)]<H[lson(k)])
son=rson(k);
else
son=lson(k);
if(H[k]<=H[son])
son=0;
else
{
swap(H[k],H[son]);
k=son;
}
}
}while(son);*/
}
int main()
{
FILE *f=fopen("algsort.in","r");
FILE *g=fopen("algsort.out","w");
//ifstream f("algsort.in");
//ofstream g("algsort.out");
fscanf(f,"%ld",&n);
for(int i=1;i<=n;i++)
{
fscanf(f,"%ld",&H[i]);
//f>>H[i];
up_up(H,i,n);
}
for(int i=n;i>=2;i--)
{
swap(H[1],H[i]);
down(H,1,i-1);
}
for(int i=n;i>=1;i--)
fprintf(g,"%ld ",H[i]);
return 0;
}