Cod sursa(job #869330)

Utilizator BitOneSAlexandru BitOne Data 1 februarie 2013 14:01:19
Problema Sortare prin comparare Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <vector>
#include <cstdlib>
#include <fstream>
#include <iterator>
#include <algorithm>


using namespace std;

const int NMAX = 500011;
const char INPUT[] = "algsort.in";
const char OUTPUT[] = "algsort.out";

class Sort
{
    Sort();
    Sort(Sort& x);
   
    static void swap(int& x, int& y) {int aux = x; x = y; y = aux;} 
    static void MergeSort(vector<int>& v, vector<int>& aux, int left, int right);

public:
    static void MergeSort(vector<int>& v)
    {
	vector<int> aux (v.size());
	MergeSort(v, aux, 0, v.size()-1);
    }
};

void Sort::MergeSort(vector<int>& v, vector<int>& aux, int left, int right)
{
    if(left >= right) return;
    if(right - left <= 10)
    {
	for(int i = left; i < right; ++i)
	{
	    for(int j = i + 1; j <= right; ++j)
	    {
		if(v[i] > v[j])
		    swap(v[i], v[j]);
	    }
	}
    }
    else 
    {
	int i, j, k = 0;
	int middle = (left + right) >> 1;
            
	MergeSort(v, aux, left, middle);
	MergeSort(v, aux, middle + 1, right);
            
	if(v[middle] <= v[middle + 1]) return;
	for(i = left, j = middle + 1; i <= middle || j <= right; )
	{
	    if(i <= middle && v[i] <= v[j])
	    {
		aux[k++] = v[i++];
	    }
	    else {
	            aux[k++] = v[j++];
	         }
	}
	for(i = left; i <= right; ++i)
	{
	    v[i] = aux[i];
	}
    }
}

int main()
{
    int N;
    vector<int> v;
    ifstream in(INPUT);
    ofstream out(OUTPUT);

    in >> N;
    copy(istream_iterator<int>(in), istream_iterator<int>(), back_inserter(v));
    Sort::MergeSort(v);
    copy(v.begin(), v.end(), ostream_iterator<int>(out, " "));
    
    return EXIT_SUCCESS;
}