Cod sursa(job #820796)

Utilizator maritimCristian Lambru maritim Data 21 noiembrie 2012 10:39:22
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<stdio.h>

FILE *f = fopen("algsort.in","r");
FILE *g = fopen("algsort.out","w");

#define MaxN 500100

int N,L;
int A[MaxN];

inline void swap(int i,int j)
{
    int aux = A[i];
    A[i] = A[j];
    A[j] = aux;
}

inline void heapUp(int poz)
{
    for(;(poz>>1) && A[poz>>1] < A[poz];swap(poz>>1,poz),poz>>=1);
}

inline void addHeap(int a)
{
    A[++L] = a;
    heapUp(L);
}

void citire(void)
{
    int a;

    fscanf(f,"%d",&N);
    for(int i=1;i<=N;i++)
    {
        fscanf(f,"%d",&a);
        addHeap(a);
    }
}

inline void heapDown(int poz)
{
    int pozM;

    for(;(poz<<1) <= L && (A[poz<<1] > A[poz] || A[(poz<<1)+1] > A[poz]);poz<<=1)
    {
        pozM = poz<<1;
        if((poz<<1)+1 <= L && A[poz<<1] < A[(poz<<1)+1])
            ++pozM;

        swap(poz,pozM);
    }
}

void afisare(void)
{
    for(int i=1;i<=N;i++)
        printf("%d ",A[i]);
    printf("\n");
}

void rezolvare(void)
{
    for(int i=1;i<=N;i++)
    {
        swap(1,L--);
        heapDown(1);
    }
}

int main()
{
    citire();
    rezolvare();

    for(int i=1;i<=N;i++)
        fprintf(g,"%d ",A[i]);
    fprintf(g,"\n");
}