Cod sursa(job #349302)

Utilizator mihaionlyMihai Jiplea mihaionly Data 18 septembrie 2009 23:22:45
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#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;
 }