Cod sursa(job #1823878)

Utilizator TincaMateiTinca Matei TincaMatei Data 6 decembrie 2016 22:37:59
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>

const int MAX_N = 10000000;
int v[1+MAX_N], next[1+MAX_N], vc[1+MAX_N];
const int NR_BITS = 4;
const int BUCKET = 1 << NR_BITS;
int start[BUCKET], last[BUCKET];

void split(int n, int e) {
  int byte, top;
  for(int i = 0; i < BUCKET; ++i)
    start[i] = 0;
  for(int i = 1; i <= n; ++i) {
    byte = (v[i] >> (e * NR_BITS)) & ((1 << NR_BITS) - 1);
    vc[i] = v[i];
    next[i] = 0;
    if(start[byte] == 0)
      start[byte] = last[byte] = i;
    else
      last[byte] = next[last[byte]] = i;
  }

  top = 1;
  for(int i = 0; i < BUCKET; ++i) {
    int j = start[i];
    while(j != 0) {
      v[top] = vc[j];
      ++top;
      j = next[j];
    }
  }
}

int main() {
  int n, a, b, c;
  FILE *fin = fopen("radixsort.in", "r");
  fscanf(fin, "%d%d%d%d", &n, &a, &b, &c);
  fclose(fin);

  v[1] = b;
  for(int i = 2; i <= n; ++i)
    v[i] = ((long long)a * v[i - 1] + b) % c;

  for(int i = 0; i < 32 / NR_BITS; ++i)
    split(n, i);

  FILE *fout = fopen("radixsort.out", "w");
  for(int i = 1; i <= n; i = i + 10)
    fprintf(fout, "%d ", v[i]);
  fclose(fout);
  return 0;
}