Cod sursa(job #2910820)

Utilizator mircea_007Mircea Rebengiuc mircea_007 Data 25 iunie 2022 12:24:11
Problema Radix Sort Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
// This program was written by Mircea Rebengiuc
// on 21.06.2022
// for problem radixsort

#include <stdio.h>
#include <ctype.h>

#define MAXN 10000000

#define NBUCKET 256
#define LBUCKET 8
#define NBITS 31

#define byte unsigned char

int v[2][MAXN]; // ~80MB
int freq[NBUCKET];

FILE *fin, *fout;

int main(){
  fin = fopen( "radixsort.in", "r" );
  fout = fopen( "radixsort.out", "w" );

  int a, c;
  int n, i, j, x, t;

  t = 0;
  fscanf( fin, "%d%d%d%d", &n, &a, v[0], &c );
  for( i = 1 ; i < n ; i++ )
    v[0][i] = (((long long)a) * v[0][i - 1] + v[0][0]) % c;

  for( x = 0 ; x < NBITS ; x += LBUCKET ){
    for( i = 0 ; i < NBUCKET ; i++ )
      freq[i] = 0;

    for( i = 0 ; i < n ; i++ )
      freq[(v[t][i] >> x) & (NBUCKET - 1)]++;

    if( freq[0] < n ){
      for( i = 1 ; i < NBUCKET ; i++ )
        freq[i] += freq[i - 1];
      for( i = NBUCKET - 1 ; i ; i-- )
        freq[i] = freq[i - 1];
      freq[0] = 0;

      for( i = 0 ; i < n ; i++ )
        v[t ^ 1][freq[(v[t][i] >> x) & (NBUCKET - 1)]++] = v[t][i];

      t ^= 1;
    }
  }

  for( i = 0 ; i < n ; i += 10 )
    fprintf( fout, "%d ", v[t][i] );
  fputc( '\n', fout );

  fclose( fin );
  fclose( fout );
  return 0;
}