Cod sursa(job #869382)

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

using namespace std;

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

inline void swap(int& x, int& y) {int aux = x; x = y; y = aux;}
void MergeSort(vector<int>& v, vector<int>& aux, int left, int right)
{
    if(left >= right) return;
    if(right - left <= 9)
    {
	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;
        int middle = (left + right) >> 1;

        MergeSort(v, aux, left, middle);
	MergeSort(v, aux, middle + 1, right);
	
        if(v[middle] <= v[middle + 1]) return;
        for(k = i = left, j = middle + 1; i <= middle && j <= right;)
	{
	    if(v[i] <= v[j])
	    {
		aux[k++] = v[i++];
	    }
	    else {
		    aux[k++] = v[j++];
	         }
	}
        for(; i <= middle; ++i, ++k) aux[k] = v[i];
	for(; j <= right;  ++j, ++k) aux[k] = v[j];

        for(i = left; i <= right; ++i)
        {
	    v[i] = aux[i];
	}
    }
}

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

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));
    MergeSort(v);
    copy(v.begin(), v.end(), ostream_iterator<int>(out, " "));

    return EXIT_SUCCESS;
}