Cod sursa(job #3175721)

Utilizator Teodor94Teodor Plop Teodor94 Data 26 noiembrie 2023 12:58:43
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
// Radix sort MSD

#include <stdio.h>
#include <string.h>

#define MAX_N 10000000
#define MAX_BITS 32      // Numerele au maxim 32 biti
#define BITS_PER_STEP 8  // Impartim pe perechi de 8 biti
const int BASE = (1 << BITS_PER_STEP);
const int MASK = BASE - 1;

// Avem nevoie de un array auxiliar, pentru a aranja numerele dupa fiecare pas al algoritmului
int v[MAX_N];

void swap(int& a, int& b) {
  int aux;

  aux = a; a = b; b = aux;
}

void sort(int v[], int left, int right, int bitNumber) {
  if (left >= right || bitNumber == -1)
    return;
 
  int i, j;
  // punem bitii de 0 la stanga
  for (i = left, j = left; i <= right; ++i)
    if ((v[i] & (1 << bitNumber)) == 0) {
      swap(v[i], v[j]);
      ++j;
    }
 
  // [left, j - 1]
  sort(v, left, j - 1, bitNumber - 1);
  // [j, right]
  sort(v, j, right, bitNumber - 1);
}

int main() {
  FILE* fin = fopen("radixsort.in", "r");
  int n, a, b, c, i;
  fscanf(fin, "%d%d%d%d", &n, &a, &b, &c);
  v[0] = b;
  for (i = 1; i < n; ++i)
    v[i] = ((long long)a * v[i - 1] + b) % c;
  fclose(fin);

  sort(v, 0, n - 1, 30);

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