Cod sursa(job #240380)

Utilizator Mishu91Andrei Misarca Mishu91 Data 7 ianuarie 2009 15:22:08
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>

#define MAX_N 500005

int V[MAX_N], H[MAX_N];
int N;

void swap(int &x, int &y)
{
    int aux = x;
    x = y;
    y = aux;
}

void citire()
{
    scanf("%d",&N);

    for(int i = 1; i <= N; ++i)
        scanf("%d",V+i);

    for(int i = 1; i <= N; ++i)
    {
        int j = i;
        H[i] = V[i];

        while(j/2 && H[j] > H[j/2])
        {
            swap(H[j], H[j/2]);
            j /= 2;
        }
    }
}

void solve()
{
    int Nh = N;

    while(Nh)
    {
        swap(H[1], H[Nh]);
        V[Nh] = H[Nh];
        Nh--;
        int i = 1;
        while(1)
        {
            int j = 2 * i;
            if(j > Nh) break;
            if(j+1 <= Nh && H[j] < H[j+1]) ++j;
            if(H[i] > H[j]) break;

            swap(H[i], H[j]);
            i = j;
        }
    }
    for(int i = 1; i <= N; ++i)
        printf("%d ", V[i]);
}

int main()
{
    freopen("algsort.in","rt",stdin);
    freopen("algsort.out","wt",stdout);

    citire();
    solve();
}