Cod sursa(job #3328014)

Utilizator calinulCalin Cernat calinul Data 5 decembrie 2025 20:51:13
Problema Sortare prin comparare Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdio.h>
#include <ctype.h>

#define NMAX 500000

int v[NMAX];

FILE *fin, *fout;

int rInt() {
  int rez = 0, ch;
  while ( !isdigit( ch = fgetc( fin ) ) );
  do
    rez = rez * 10 + ch - '0';
  while ( isdigit( ch = fgetc( fin ) ) );
  return rez;
}

void wInt( int x ) {
  int cf[11], i = 0;
  do {
    cf[i++] = x % 10;
    x /= 10;
  } while ( x > 0 );
  for ( i = i - 1; i >= 0; i-- )
    fputc( cf[i] + '0', fout );
  fputc( ' ', fout );
}

static inline void swap( int *a, int *b ) {
  int aux = *a;
  *a = *b;
  *b = aux;
}

void radixSort( int v[], int begin, int end, int bit ) {
  int p = begin, i;

  if ( begin < end && bit >= 1 ) {
    for ( i = begin; i <= end; i++ )
      if ( (v[i] & bit) == 0 ) {
        swap( &v[p], &v[i] );
        p++;
      }
    radixSort( v, begin, p - 1, bit / 2 );
    radixSort( v, p, end, bit / 2 );
  }
}

int main() {
  int n, i;

  fin = fopen( "algsort.in", "r" );
  n = rInt();
  for ( i = 0; i < n; i++ )
    v[i] = rInt();
  fclose( fin );

  radixSort( v, 0, n - 1, 1 << 30 );

  fout = fopen( "algsort.out", "w" );
  for ( i = 0; i < n; i++ )
    wInt( v[i] );
  fputc( '\n', fout );
  fclose( fout );

  return 0;
}