Cod sursa(job #2910753)

Utilizator mircea_007Mircea Rebengiuc mircea_007 Data 24 iunie 2022 21:38:54
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 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

// daca nu iau MLE e miracol

int v[MAXN]; // ~40MB
int index[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;

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

  t = 0;
  for( i = 0 ; i < n ; i++ )
    index[t][i] = i;

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

    for( i = 0 ; i < n ; i++ )
      freq[(v[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++ ){
        j = index[t][i];
        index[t ^ 1][freq[(v[j] >> x) & (NBUCKET - 1)]++] = j;
      }

      t ^= 1;
    }
  }

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

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