Cod sursa(job #2952082)

Utilizator vlad_dimuVlad Dimulescu vlad_dimu Data 8 decembrie 2022 10:47:05
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>

using namespace std;

ifstream fin( "sort.in" );
ofstream fout( "sort.out" );

int v[1000];

void myqsort( int v[], int begin, int end ){
  int b = begin, e = end, pivot = v[(begin + end) / 2], aux;
  while( v[b] < pivot )
    b++;
  while( v[e] > pivot )
    e--;

  while( b < e ){
    aux = v[e];
    v[e] = v[b];
    v[b] = aux;

    do
      b++;
    while( v[b] < pivot );

    do
      e--;
    while( v[e] > pivot );
  }

  if( begin < e )
    myqsort( v, begin, e );
  if( e + 1 < end )
    myqsort( v, e + 1, end );
}

void merge( int v[], int st, int mij, int dr ){
  int s1 = mij - st + 1, s2 = dr - mij, i1 = 0, i2 = 0, i3 = st;
  int *left = new int[s1], *right = new int[s2];

  for( int i = 0; i < s1; i++ )
    left[i] = v[st + i];
  for( int i = 0; i < s2; i++ )
    right[i] = v[mij + 1 + i];

  while( i1 < s1 && i2 < s2 ){
    if( left[i1] <= right[i2] ){
      v[i3] = left[i1];
      i1++;
    }
    else{
      v[i3] = right[i2];
      i2++;
    }
    i3++;
  }

  while( i1 < s1 ){
    v[i3] = left[i1];
    i1++;
    i3++;
  }
  while( i2 < s2 ){
    v[i3] = right[i2];
    i2++;
    i3++;
  }

  delete[] left;
  delete[] right;
}

void mergesort( int v[], int begin, int end ){
  if( begin == end )
    return;

  int mij = (begin + end) / 2;
  mergesort(v, begin, mij );
  mergesort( v, mij + 1, end );

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

int main(){
    int n, i;
    fin >> n;
    for( i = 0; i < n; i++ )
      fin >> v[i];

    myqsort( v, 0, n - 1 );
    for( i = 0; i < n; i++ )
      fout << v[i] << ' ';
    return 0;
}