Cod sursa(job #820782)

Utilizator maritimCristian Lambru maritim Data 21 noiembrie 2012 10:30:04
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 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 &a,int &b)
{
    int aux = a;
    a = b;
    b = aux;
}

inline void heapUp(int poz)
{
    for(;(poz>>1) && A[poz>>1] < A[poz];swap(A[poz>>1],A[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(A[poz],A[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(A[1],A[L--]);
        heapDown(1);
    }
}

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

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