Cod sursa(job #2466575)

Utilizator Tudor06MusatTudor Tudor06 Data 2 octombrie 2019 17:44:24
Problema Sortare prin comparare Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

#define NMAX 500000
#define BSIZE 10000

int v[NMAX];
char buf[BSIZE];
int ix = BSIZE;

void QuickSort( int st, int dr ) {
  int i, poz_piv, aux;
  poz_piv = st;
  i = st + 1;
  while ( i <= dr ) {
    if ( v[i] < v[poz_piv] ) {
      aux = v[poz_piv]; /// Interschimbam pivotul cu elementul de dupa el
      v[poz_piv] = v[poz_piv + 1];
      v[poz_piv + 1] = aux;
      poz_piv ++;
      if ( v[poz_piv - 1] >= v[poz_piv] ) { /// Verificam daca elementul interschimbat anterior nu este chiar elementul mai mic
        aux = v[i]; /// Interschimbam acum elementul gasit mai mic decat pivotul cu elementul din spatelele lui
        v[i] = v[poz_piv - 1];
        v[poz_piv - 1] = aux;
      }
    }
    i ++;
  }
  if ( st < poz_piv - 1 ) {
    QuickSort( st, poz_piv - 1 );
  }
  if ( dr > poz_piv + 1 )
    QuickSort( poz_piv + 1, dr );
}

FILE *fin = fopen( "algsort.in", "r" ), *fout = fopen( "algsort.out", "w" );


char chr() {
  if ( ix == BSIZE ) {
    fread( buf, 1, BSIZE, fin );
    ix = 0;
  }
  ix ++;
  return buf[ix - 1];
}

int nr() {
  int nr = 0;
  char ch;
  ch = chr();
  while ( ch >= '0' && ch <= '9' ) {
    nr = nr * 10 + ch - '0';
    ch = chr();
  }
  return nr;
}

int main() {
  int i, n;
  n = nr();
  for ( i = 0; i < n; i ++ ) {
    v[i] = nr();
  }
  QuickSort( 0, n - 1 );
  for ( i = 0; i < n; i ++ ) {
    fprintf( fout, "%d ", v[i] );
  }
  return 0;
}