Cod sursa(job #2674939)

Utilizator Teodor94Teodor Plop Teodor94 Data 20 noiembrie 2020 20:00:40
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
// Radix sort in baza 256
// Fara memorie dinamica

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

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

inline bool isDigit(char c) {
  return c >= '0' && c <= '9';
}

// citire numar natural
int readInt(FILE* fin) {
  char ch;
  int res = 0;

  // eliminam caracterele de dinaintea numarului (spatiu, rand nou, orice caracter care nu este cifra)
  while (!isDigit(ch = fgetc(fin)));

  // adaugam cifrele la numar pana cand caracterul citit nu mai este cifra
  do {
    res = 10 * res + ch - '0';
  } while (isDigit(ch = fgetc(fin)));

  return res;
}

#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 MASK = (1 << BITS_PER_STEP) - 1;

// Avem nevoie de un array auxiliar, pentru a aranja numerele dupa fiecare pas al algoritmului
int v1[MAX_N], v2[MAX_N];
int frequency[1 << BITS_PER_STEP], index[1 << BITS_PER_STEP];

void sort(int v[], int aux[], int n, int bits) {
  if (bits == MAX_BITS)
    return;

  // Resetam vectorul de frecventa la fiecare pas nou
  memset(frequency, 0, sizeof(frequency));

  int i;
  for (i = 0; i < n; ++i)
    ++frequency[v[i] >> bits & MASK];

  index[0] = 0;
  for (i = 1; i < (1 << BITS_PER_STEP); ++i)
    index[i] = index[i - 1] + frequency[i - 1];

  for (i = 0; i < n; ++i)
    aux[index[v[i] >> bits & MASK]++] = v[i];

  sort(aux, v, n, bits + BITS_PER_STEP);
}

int main() {
  FILE* fin = fopen("algsort.in", "r");
  int n, i;
  fscanf(fin, "%d", &n);
  for (i = 0; i < n; ++i)
    v1[i] = readInt(fin);
  fclose(fin);

  sort(v1, v2, n, 0);

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