Cod sursa(job #1008367)

Utilizator Teodor94Teodor Plop Teodor94 Data 10 octombrie 2013 21:49:45
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#include <cassert>

#define MAX_N 500000

int n, v[MAX_N];

void read( FILE *fin ) {
    assert( fscanf( fin, "%d", &n ) == 1 );
    for ( int i = 0; i < n; ++i )
        assert( fscanf( fin, "%d", &v[i] ) == 1 );
}

void write( FILE *fout ) {
    for ( int i = 0; i < n; ++i )
        fprintf( fout, "%d ", v[i] );
}

void merge( int left, int mid, int right ) {
    int c[MAX_N];
    int i = left, j = mid + 1, k = 0;
    while ( i <= mid && j <= right ) {
        if ( v[i] < v[j] ) {
            c[k] = v[i];
            ++i;
        }
        else {
            c[k] = v[j];
            ++j;
        }
        ++k;
    }

    while ( i <= mid ) {
        c[k] = v[i];
        ++i;
        ++k;
    }

    while ( j <= right ) {
        c[k] = v[j];
        ++j;
        ++k;
    }

    for ( i = 0; i < k; ++i )
        v[left + i] = c[i];
}

void merge_sort( int left, int right ) {
    if ( left == right )
        return;

    int mid = ( left + right ) >> 1;
    merge_sort( left, mid );
    merge_sort( mid + 1, right );

    merge( left, mid, right );
}

int main() {
    FILE *fin, *fout;

    fin = fopen( "algsort.in", "r" );
    read( fin );
    fclose( fin );

    merge_sort( 0, n - 1 );

    fout = fopen( "algsort.out", "w" );
    write( fout );
    fclose( fout );
}