Cod sursa(job #3327686)

Utilizator Teodor94Teodor Plop Teodor94 Data 4 decembrie 2025 19:25:20
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>

#define MAX_N 500000

#define BITS_PER_STEP 4
 
int v[MAX_N], aux[MAX_N];
int freq[1 << BITS_PER_STEP], ind[1 << BITS_PER_STEP];

void sort(int v1[], int v2[], int left, int right, int bitNumber) {
  if (left >= right || bitNumber == 0)
    return;
 
  int i;
  
  for (i = 0; i < (1 << BITS_PER_STEP); ++i)
    freq[i] = ind[i] = 0;
  
  for (i = left; i <= right; ++i) {
    int bucketNumber = (v1[i] >> (bitNumber - BITS_PER_STEP)) & ((1 << BITS_PER_STEP) - 1);
    ++freq[bucketNumber];
  }

  ind[0] = 0;
  for (i = 1; i < (1 << BITS_PER_STEP); ++i)
    ind[i] = ind[i - 1] + freq[i - 1];

  for (i = left; i <= right; ++i) {
    int bucketNumber = (v1[i] >> (bitNumber - BITS_PER_STEP)) & ((1 << BITS_PER_STEP) - 1);
    v2[left + ind[bucketNumber]] = v1[i];
    ind[bucketNumber]++;
  }
  
  int add = 0;
  for (i = 0; i < (1 << BITS_PER_STEP); ++i)
  {
    sort(v2, v1, left + add, left + add + freq[i] - 1, bitNumber - BITS_PER_STEP);
    add += freq[i];
  }
}

int main() {
  FILE* fin = fopen("algsort.in", "r");
  int n, i;
  fscanf(fin, "%d", &n);
  for (i = 0; i < n; ++i)
    fscanf(fin, "%d", &v[i]);
  fclose(fin);
 
  // Sortam intre [0, n - 1], pornind de la cel mai semnificativ bit (al 32-lea)
  sort(v, aux, 0, n - 1, 32);
 
  FILE* fout = fopen("algsort.out", "w");
  for (i = 0; i < n; ++i)
    fprintf(fout, "%d ", v[i]);
  fclose(fout);
  return 0;
}