Pagini recente » Cod sursa (job #2203377) | Cod sursa (job #2891253) | Cod sursa (job #1373366) | Cod sursa (job #131939) | Cod sursa (job #1794297)
#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;
}