Pagini recente » Cod sursa (job #945328) | Cod sursa (job #1210023) | Cod sursa (job #2118922) | Cod sursa (job #1360496) | Cod sursa (job #1794290)
#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];
}
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);
}
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;
}