Pagini recente » Cod sursa (job #635974) | Cod sursa (job #1172348) | Cod sursa (job #1545787) | Cod sursa (job #1546960) | Cod sursa (job #1787526)
#include <cstdio>
using namespace std;
#define n_max 1000000
int a[n_max],n;
int main()
{
FILE *f=fopen("algsort.in","r");
fscanf(f,"%d",&n);
int i,nodc,aux,fiu;
for(i=1;i<=n;++i)
{
fscanf(f,"%d",&a[i]);
nodc=i;
while(nodc/2 && a[nodc]>a[nodc/2])//deci kt timp ta'su (adik nodc/2) exista shi
//nodul curent a[nodc] este mai mare ca ta'su
{
aux=a[nodc];a[nodc]=a[nodc/2];a[nodc/2]=aux;
nodc/=2;
}
}
for(i=n;i>1;--i)
{
//shtergem radacina - de fapt o mutam pe poz. i
aux=a[1];a[1]=a[i];a[i]=aux;
//in acest moment a[i-1] este ULTIMUL nod din heap.
//reparam heapul
nodc=1;
while(1)
{
fiu=2*nodc;//fiu=ala din stinga
if(fiu>i-1)break;//dak nu mai exista ala din stinga - PA
if(fiu+1<=i-1/*adik fiul din dreapta exista*/&& a[fiu+1]>a[fiu])++fiu;
//shi este mai mare ca ala din stinga - il aleg pe cel din dreapta
//in acest moment a[fiu] este fiul cu valoarea cea mai mica
if(a[nodc]>a[fiu])break;
aux=a[nodc];a[nodc]=a[fiu];a[fiu]=aux;
nodc=fiu;
}
}
fclose(f);
f=fopen("algsort.out","w");
for(i=1;i<=n;++i)
fprintf(f,"%d ",a[i]);
return 0;
}