Cod sursa(job #3326625)

Utilizator calinulCalin Cernat calinul Data 29 noiembrie 2025 17:39:57
Problema Sortare prin comparare Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <stdio.h>
#include <ctype.h>

#define NMAX 500000

int v[NMAX], aux[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 );
}

void merge( int v[], int begin, int mj, int end ) { // merge [begin, mj] si [mj + 1, end]
  int i = begin, j = mj + 1, n = i;
  while ( i <= mj || j <= end )
    if ( i <= mj && (j == end + 1 || v[i] <= v[j]) ) {
      aux[n++] = v[i++];
    } else {
      aux[n++] = v[j++];
    }
  for ( ; begin <= end; begin++ )
    v[begin] = aux[begin];
}

void mergesort( int v[], int begin, int end ) {
  int mj = (begin + end) / 2;

  if ( begin < end ) {
    mergesort( v, begin, mj );
    mergesort( v, mj + 1, end );

    merge( v, begin, mj, end );
  }
}

int main() {
  int n, i;

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

  mergesort( v, 0, n - 1 );

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

  return 0;
}