Cod sursa(job #2679001)

Utilizator TghicaGhica Tudor Tghica Data 29 noiembrie 2020 12:30:13
Problema Sortare prin comparare Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>

#define NMAX 500000
#define NR_BUCKETS 128
#define SIZE_BUCKETS (1 << 15)
#define NR_BITS 6

int v1[NMAX], v2[NMAX], f[NR_BUCKETS + 1], poz[NR_BUCKETS];

int bucket(int val) {
  val = val >> NR_BITS;
  return val;
}

void sort( int v[], int bo, int eo ) {
  int c, b = bo, e = eo, pivot = v[(bo + eo) / 2];
  while ( v[b] < pivot )
      b++;
  while ( v[e] > pivot )
      e--;
  while ( b < e ) {
      c = v[e];
      v[e] = v[b];
      v[b] = c;
      do
          b++;
      while ( v[b] < pivot );

      do
          e--;
      while ( v[e] > pivot );
  }
  if ( bo < e )
      sort(v, bo, e );
  if ( e + 1 < eo )
      sort(v, e + 1, eo );
}

int main() {
  FILE* fin = fopen("algsort.in", "r");
  FILE* fout = fopen("algsort.out", "w");
  int n, i;
  fscanf( fin, "%d", &n );
  for ( i = 0; i < n; i++)
    fscanf( fin, "%d", &v1[i] );
  for ( i = 0; i < n; i++ )
    f[bucket(v1[i]) + 1]++;
  for (i = 1; i < NR_BUCKETS; i++)
    poz[i] = poz[i - 1] + f[i];
  for ( i = 0; i < n; i++ )
    v2[poz[bucket(v1[i])]++] = v1[i];
  for (i = 1; i <= NR_BUCKETS; i++) {
    f[i] += f[i - 1];
    sort(v2, f[i - 1], f[i] - 1);
  }
  for (i = 0; i < n; i++)
    fprintf(fout, "%d ", v2[i]);
  return 0;
}