Pagini recente » Borderou de evaluare (job #3208266) | Cod sursa (job #1163258) | Cod sursa (job #933067) | Cod sursa (job #2786054) | Cod sursa (job #349302)
Cod sursa(job #349302)
#include <stdio.h>
typedef long long big;
typedef unsigned uint;
#define nmax 500001
#define min(a,b) ((a<b)?(a):(b))
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
{
if(k>1&&H[father(k)]>H[k])
{
swap(H[father(k)],H[k]);
k=father(k);
}
else
break;
}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])
break;
if(son)
{
swap(H[k],H[son]);
k=son;
}
}
else break;
}
}
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;
}