Cod sursa(job #649377)

Utilizator andreioneaAndrei Onea andreionea Data 15 decembrie 2011 21:46:37
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>

#define INFILE "algsort.in"
#define OUTFILE "algsort.out"

using namespace std;

void mergesort(vector<int> &a, int st, int dr)
{
	if (st >= dr)
		return;
	int m = (st + dr) / 2;
	mergesort(a, st, m);
	mergesort(a, m+1, dr);
		
	vector<int>::iterator first = a.begin() + st;
	vector<int>::iterator middle = a.begin() + m + 1;
	vector<int>::iterator second = a.begin() + m + 1;
	vector<int>::iterator end = a.begin() + dr + 1;
	
	vector<int> aux; 
	aux.reserve(dr-st+1);
	while (first != middle && second != end)
	{
		if (*first < *second)
			aux.push_back(*(first++));
		else
			aux.push_back(*(second++));
	}
	while (first != middle)
		aux.push_back(*(first++));
	while (second != end)
		aux.push_back(*(second++));
		
	for (vector<int>::iterator it1 = a.begin() + st, it2 = aux.begin(); it2 != aux.end(); ++it1, ++it2)
		*it1 = *it2;
}
int main()
{
	vector<int> v;
	int n;
	
	mergesort(v, 0, v.size()-1);
	
	ifstream fin(INFILE);
	ofstream fout(OUTFILE);
	fin >> n;
	v.reserve(n);
	for(int i = 0; i<n; ++i){
		int k;
		fin >> k;
		v.push_back(k);
	}
	
	mergesort(v, 0, n-1);
	for(vector<int>::iterator it = v.begin(); it != v.end(); ++it)
		fout << *it << " ";

	fin.close();
	fout.close();
	
	return 0;
}