Cod sursa(job #3259621)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 26 noiembrie 2024 22:19:40
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <algorithm>
#include <stdio.h>
#define BIT 15
const int NR_BUCKKET = ( 1 << 16 );
const int MAX = ( 1 << 31 );
const int BAZ = ( 1 << BIT );
int freq[ NR_BUCKKET + 2 ];
int f[ NR_BUCKKET + 2 ];
int nr[ BAZ + 10 ];
int aux[ 500004 ];
int v[ 500004 ];

int bucket( int val ){
    return val >> BIT;
}

/*void freq_sort( int left, int right, int biti ){
    int val = biti * BAZ;
    for( int i = left; i < right; i++ )
        ++nr[ aux[ i ] - val ];
    for( int i = 0; i <= BAZ; i++ )
        while( nr[ i ]-- )
            aux[ left++ ] = i + val;
}*/

int main()
{
    int n;
    FILE *fin = fopen( "algsort.in", "r" );
    fscanf( fin, "%d", &n );
    for( int i = 0; i < n; i++ ){
        fscanf( fin, "%d", &v[ i ] );
        ++freq[ bucket( v[ i ] ) ];
    }
    fclose( fin );
    for( int i = 1; i < NR_BUCKKET; i++ )
        f[ i ] = f[ i - 1 ] + freq[ i - 1 ];
    for( int i = 0; i < n; i++ )
        aux[ f[ bucket( v[ i ] ) ]++ ] = v[ i ];
    //freq_sort( 0, freq[ 0 ], 0 );
    std::sort( aux, aux + freq[ 0 ] );
    for( int i = 1; i < NR_BUCKKET; i++ ){
        freq[ i ] += freq[ i - 1 ];
        //for( int j = 0; j < n; j++ )
        //    printf( "%d ", aux[ j ] );
       // printf( "\n %d %d\n", freq[ i - 1 ], freq[ i ] );
        std::sort( aux + freq[ i - 1 ], aux + freq[ i ] );
       // freq_sort( freq[ i - 1 ], freq[ i ], i );
    }
    FILE *fout = fopen( "algsort.out", "w" );
    for( int i = 0; i < n; i++ )
        fprintf( fout, "%d ", aux[ i ] );
    fclose( fout );
    return 0;
}