Cod sursa(job #2680787)

Utilizator TghicaGhica Tudor Tghica Data 4 decembrie 2020 13:04:12
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>

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

int v1[NMAX], v2[NMAX], f[NR_BUCKETS], 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])]++;
  for (i = 1; i < NR_BUCKETS; i++)
    poz[i] = poz[i - 1] + f[i - 1];
  for ( i = 0; i < n; i++ )
    v2[poz[bucket(v1[i])]++] = v1[i];
  sort(v2, 0, poz[0] - 1);
  for (i = 1; i < NR_BUCKETS; i++) {
    if( f[i] )
      sort(v2, poz[i - 1], poz[i] - 1);
  }
  for (i = 0; i < n; i++)
    fprintf(fout, "%d ", v2[i]);
  return 0;
}