Cod sursa(job #2911832)

Utilizator Alex_HossuHossu Alexandru Alex_Hossu Data 2 iulie 2022 16:00:48
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>
#include <climits>

#define MAX_N 10000000

int v[MAX_N];
int res[MAX_N];
int frecv[10];

int sizeVect;

static inline int maxElem() {
  int maxCif = v[0];
  for (int i = 1; i < sizeVect; i++)
    if (v[i] > maxCif)
      maxCif = v[i];
  return maxCif;
}

int main() {
  FILE *fin, *fout;
  int a, b, c;
  int i, maxNrVect, put;

  fin = fopen("radixsort.in", "r");
  fscanf(fin, "%d%d%d%d", &sizeVect, &a, &b, &c);
  fclose(fin);

  v[0] = b;
  for (i = 1; i < sizeVect; i++)
    v[i] = (a * v[i - 1] + b) % c;

  maxNrVect = maxElem();

  for (put = 1; maxNrVect / put > 0; put *= 10) {
    for (i = 0; i < 10; ++i)
      frecv[i] = 0;

    for (i = 0; i < sizeVect; i++)
      frecv[(v[i] / put) % 10]++;

    for (i = 1; i < 10; i++)
      frecv[i] += frecv[i - 1];

    for (i = sizeVect - 1; i >= 0; i--) {
      res[frecv[(v[i] / put) % 10] - 1] = v[i];
      //printf("%d %d\n", v[i], frecv[(v[i] / put) % 10] - 1);
      frecv[(v[i] / put) % 10]--;
    }
    //printf("\n");

    for (int i = 0; i < sizeVect; i++) {
      v[i] = res[i];
      res[i] = 0;
    }
    //for (i = 0; i < sizeVect; i++)
      //printf("%d ", v[i]);
    //printf("\n");
  }

  fout = fopen("radixsort.out", "w");

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

  fclose(fout);

  return 0;
}