Cod sursa(job #2739274)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 7 aprilie 2021 14:50:05
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin( "algsort.in" );
ofstream fout( "algsort.out" );

const long long INF = 2000000000001;

int N;
int v[500005];

void Heapify( int idx ) {
    if( idx * 2 <= N ) Heapify( idx * 2 );
    if( idx * 2 + 1 <= N ) Heapify( idx * 2 + 1 );

    long long val1, val2;

    /// get values of both child nodes
    if( idx * 2 > N ) val1 = INF;
    else val1 = v[2 * idx];

    if( idx * 2 + 1 > N ) val2 = INF;
    else val2 = v[2 * idx + 1];

    /// if the nodes are in the right place return
    if( min( val1, val2 ) >= v[idx] ) return;

    if( val1 < val2 ) {
        swap( v[idx], v[idx * 2] );
        Heapify( idx * 2 );
    }
    else {
        swap( v[idx], v[idx * 2 + 1] );
        Heapify( idx * 2 + 1 );
    }
}

void downheap( int idx ) {
    long long val1, val2;

    if( idx * 2 > N ) val1 = INF;
    else val1 = v[2 * idx];

    if( idx * 2 + 1 > N ) val2 = INF;
    else val2 = v[2 * idx + 1];

    if( min( val1, val2 ) >= v[idx] ) return;

    if( val1 < val2 ) {
        swap( v[idx], v[idx * 2] );
        downheap( idx * 2 );
    }
    else {
        swap( v[idx], v[idx * 2 + 1] );
        downheap( idx * 2 + 1 );
    }
}

int heap_pop() {
    swap( v[1], v[N] );
    --N;

    downheap( 1 );
}

int main()
{
    fin >> N;
    for( int i = 1; i <= N; ++i )
        fin >> v[i];

    /*Heapify( 1 );

    //for( int i = 1; i <= N; ++i )
    //    fout << v[i] << ' ';

    */

    for( int i = N; i > 0; --i )
        downheap( i );

    while( N ) {
        fout << v[1] << ' ';
        heap_pop();
    }


    return 0;
}