Cod sursa(job #1794297)

Utilizator nnnmmmcioltan alex nnnmmm Data 1 noiembrie 2016 09:56:13
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<cstdio>
#include<algorithm>

const int NMAX=500001;

int v[NMAX],heap[NMAX];
int marime_heap;

int Tata(int x)
{
 return x/2;
}

int Fiu_st(int x)
{
 return 2*x;
}

int Fiu_dr(int x)
{
 return 2*x+1;
}

void Swap(int x,int y)
{
 std::swap(heap[x],heap[y]);
}

void Up(int poz)
{
 while(poz>1 && v[heap[Tata(poz)]]>v[heap[poz]])
       {
        Swap(poz,Tata(poz));
        poz=Tata(poz);
       }
}

void Down(int poz)
{
 while(poz<marime_heap)
       {
        int best=poz;
        if(Fiu_st(poz)<=marime_heap && v[heap[Fiu_st(poz)]]<v[heap[best]])
           best=Fiu_st(poz);
        if(Fiu_dr(poz)<=marime_heap && v[heap[Fiu_dr(poz)]]<v[heap[best]])
           best=Fiu_dr(poz);
        if(best==poz)
           return;
        Swap(best,poz);
        poz=best;
       }
}

void Adauga(int poz)
{
 marime_heap++;
 heap[marime_heap]=poz;
 Up(marime_heap);
}

void Scoate(int poz)
{
 Swap(poz,marime_heap);
 marime_heap--;
 Up(poz);
 Down(poz);
}

int Rasp()
{
 return heap[1];
}

void Heapify()
{
 for(int i=marime_heap/2;i>=1;i--)
     Down(i);
}

int main()
{
 FILE *in=fopen("algsort.in","r");
 int n;
 fscanf(in,"%d ",&n);
 for(int i=1;i<=n;i++)
     {
      fscanf(in,"%d ",&v[i]);
      //Adauga(i);
      heap[i]=i;
     }
 marime_heap=n;
 Heapify();
 fclose(in);
 FILE *out=fopen("algsort.out","w");
 for(int i=1;i<=n;i++)
     {
      fprintf(out,"%d ",v[Rasp()]);
      Scoate(1);
     }
 fclose(out);
 return 0;
}