Pagini recente » Cod sursa (job #2289888) | Cod sursa (job #1207668) | Cod sursa (job #2724931) | Cod sursa (job #1822443) | Cod sursa (job #738596)
Cod sursa(job #738596)
#include<cstdio>
#include<cstdlib>
#define in "r"
#define out "w"
#define lmax 500050
using namespace std;
FILE *f=fopen("algsort.in",in),*g=fopen("algsort.out",out);
int n,a[lmax],i;
int lefts(int );
int rights(int );
void read()
{
int i;
fscanf(f,"%d",&n);
for(i=1; i<=n; i++)
fscanf(f,"%d",&a[i]);
}
inline int lefts(int n)
{
return 2*n;
}
inline int rights(int n)
{
return 2*n+1;
}
inline int father(int n)
{
return n/2;
}
void schimbint (int &a,int &b)
{
int aux;
aux=a;
a=b;
b=aux;
}
void move_down(int x)
{
if((rights(x))<=n)
{
if(a[rights(x)]>a[x] && a[rights(x)]>=a[lefts(x)])
schimbint (a[x],a[rights(x)]),move_down(rights(x));
else if(a[lefts(x)]>a[x])
schimbint (a[x],a[lefts(x)]),move_down(lefts(x));
}
else if(lefts(x)<=n && a[x]<a[lefts(x)])
schimbint (a[x],a[lefts(x)]),move_down(lefts(x));
}
void build_heap()
{
int i;
for(i=n/2; i>=1; i--)
move_down(i);
}
void show_heap()
{
int i;
for(i=1; i<=n; i++)
fprintf(g,"%d ",a[i]);
}
void heapsort(int &n)
{
int i,nn=n;
build_heap();
for(i=nn; i>=2; i--)
{
schimbint (a[i],a[1]);
n--;
move_down(1);
}
n=nn;
}
int main()
{
read();
heapsort(n);
show_heap();
fclose(f);
fclose(g);
return 0;
}