Cod sursa(job #978956)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 30 iulie 2013 17:39:39
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>

using namespace std;

/*
    MaxHeap
*/

#define Nmax 500003

#define Parent(i) i/2
#define LeftSon(i) 2*i
#define RightSon(i) 2*i+1
#define Maxim(H) H[1]

void InitHeap( int *H )
{
    for ( int i = 0; i < Nmax; ++i )
            H[i] = 0;
}

void DownHeap( int *H, int N, int poz )
{
    int k = poz;
    int j = k;

    do
    {
        j = k;

        if ( LeftSon(j) <= N && H[LeftSon(j)] < H[k] )  k = LeftSon(j);     // Schimba semnul pentru MinHeap
        if ( RightSon(j)<= N && H[RightSon(j)] < H[k] ) k = RightSon(j);    // Schimba semnul pentru MinHeap

        swap( H[j], H[k] );

    } while( j != k );
}

void UpHeap( int *H, int N, int poz )
{
    int k = poz;
    int j = k;

    do
    {
        j = k;

        if ( j > 1 && H[Parent(j)] > H[k] ) k = Parent(j);  // Schimba semnul pentru MinHeap

        swap( H[j], H[k] );

    } while( j != k );
}

void InsertHeap( int *H, int &N, int key )
{
    H[ ++N ] = key;

    UpHeap( H, N, N );
}

void DeleteMax( int *H, int &N )
{
    H[1] = H[N];

    DownHeap( H, N, 1 );

    N--;
}

int main()
{
    int H[500004], n = 0, m, a;

    ifstream f("algsort.in");
    ofstream g("algsort.out");

    InitHeap( H );

    f >> m;

    for ( int i = 0; i < m; ++i )
            f >> a,
            InsertHeap( H, n, a );

    for ( int i = 0; i < m; ++i )
    {
        g << Maxim(H) << " ";
        DeleteMax(H,n);
    }

    return 0;
}