Cod sursa(job #1569038)

Utilizator thinkphpAdrian Statescu thinkphp Data 14 ianuarie 2016 22:00:25
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <fstream>
#include <iostream>
#define FIN "algsort.in"
#define FOUT "algsort.out"

using namespace std;

class Container {

      public:
      Container( int _n ): n( _n ){

           vec = new int[ n ];

           k = 0;
      }

      void added(int elem) {

           *( vec + k++ ) = elem;
      }

      void sorted() {
 
           _divide(0, n - 1); 
      }

      void display() {

           ofstream fout( FOUT );

           for(int i = 0; i < n; ++i) fout<<vec[ i ]<<" ";
      }

      private:
      int *vec;
      int n, k;

      void _divide(int lo,int hi) {

           if((hi - lo) <= 1) {

               if(vec[lo] > vec[ hi ]) _swap(vec + lo, vec + hi);

           } else {

           int m;

               m = (lo + hi) >> 1;  

               _divide(lo, m);

               _divide(m + 1, hi);

               _merge(lo, m, hi);
           }
      }

      void _merge(int lo, int m, int hi) {

           int i = lo,

               j = m + 1,

               k = lo;

           int *aux; 
  
               aux = new int[ hi - lo + 1 ];

               for(int it = lo; it <= hi; ++it) aux[ it - lo ] = vec[ it ];

               while(i <= m && j <= hi) {

                     if( aux[ i - lo ] <= aux[ j - lo ]) vec[ k++ ] = aux[ i++ - lo];

                          else 

                                              vec[ k++ ] = aux[ j++ - lo];
               }

               while(i <= m) vec[ k++ ] = aux[ i++ - lo];

               while(j <= hi) vec[ k++ ] = aux[ j++ - lo];

               delete [] aux; 
      } 


      void _swap(int *i, int *j) {

                 int x = *i;
 
                     *i = *j;

                     *j = x;

      }
};

int main() {

    int n, 
        elem;

    ifstream fin( FIN );    
 
    fin>>n;

    Container container( n );

    for(int i = 0; i < n; ++i) fin>>elem, container.added( elem );

    container.sorted();

    container.display(); 

    return(0);
};