Cod sursa(job #1787526)

Utilizator cosminmaneaCosmin Manea cosminmanea Data 24 octombrie 2016 19:33:59
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#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;
}