Cod sursa(job #2680789)

Utilizator teodorescunicolasteodorescu nicolas alexandru teodorescunicolas Data 4 decembrie 2020 13:08:04
Problema Sortare prin comparare Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <stdio.h>
#define NMAXX 500000
#define NRBUCKETS (1 << 16)
#define VALBIT 15

int v1[NMAXX], v2[NMAXX], frecv[NRBUCKETS], indici[NRBUCKETS];

inline int nrbucket( int val ) {
    return val >> VALBIT;
}

void qsort( int v[], int begin, int end ) {
    int b = begin, e = end, pivot = v[(begin + end) / 2], aux;
    while ( v[b] < pivot ) {
        b++;
    }
    while ( v[e] > pivot ) {
        e--;
    }
    while ( b < e ) {
        aux = v[b];
        v[b] = v[e];
        v[e] = aux;
        do {
            b++;
        } while ( v[b] < pivot );
        do {
            e--;
        } while ( v[e] > pivot );
    }
    if ( begin < e ) {
        qsort( v, begin, e );
    }
    if ( e + 1 < end ) {
        qsort( v, e + 1, end );
    }
}

int main()
{
    FILE *fin, *fout;
    int n, i, buck;
    fin = fopen( "algsort.in", "r" );
    fout = fopen( "algsort.out", "w" );
    fscanf( fin, "%d", &n );
    for ( i = 0; i < n; i++ )
        fscanf( fin, "%d", &v1[i] );
    for ( i = 0; i < n; i++ ) {
        buck = nrbucket( v1[i] );
        frecv[buck]++;
    }
    for ( i = 1; i < NRBUCKETS; i++ )
        indici[i] = indici[i - 1] + frecv[i - 1];
    for ( i = 0; i < n; i++ ) {
        buck = nrbucket( v1[i] );
        v2[indici[buck]] = v1[i];
        indici[buck]++;
    }
    qsort( v2, indici[0] - frecv[0], indici[1] - 1 );
    for ( i = 1; i < NRBUCKETS; i++ ) {
        if ( frecv[i] != 0 ) {
            qsort( v2, indici[i - 1] - frecv[i - 1], indici[i] - 1 );
        }
    }
    for ( i = 0; i < n; i++ ) {
        fprintf( fout, "%d ", v2[i] );
    }
    fclose( fin );
    fclose( fout );
    return 0;
}