Cod sursa(job #1016934)

Utilizator TwoOfDiamondsDaniel Alexandru Radu TwoOfDiamonds Data 26 octombrie 2013 22:15:49
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <vector>

using namespace std;

//functia pentru mergesort
void MergeSort(vector<int> &vec)
{
	//daca vectorul are mai mult de 1 element
	//in caz contrar vom considera vectorul sortat
	if (vec.size() > 1)
	{
		//se imparte vectorul in 2 subvectori egali
		vector<int> left(vec.begin(), vec.begin() + vec.size() / 2);
		vector<int> right(vec.begin() + vec.size() / 2, vec.end());

		//se aplica functia mergesort recursiv pentru fiecare jumatate
		MergeSort(left);
		MergeSort(right);

		//se goleste vectorul actual pentru a se adauga elementele sortate
		vec.clear();

		//se realizeaza interclasarea celor 2 vectori sortati
		while (!left.empty() && !right.empty())
		{
			if (left[0] < right[0])
			{
				vec.push_back(left[0]);
				left.erase(left.begin());
			}

			else
			{
				vec.push_back(right[0]);
				right.erase(right.begin());
			}
		}

		while (left.empty() && !right.empty())
		{
			vec.push_back(right[0]);
			right.erase(right.begin());
		}

		while (!left.empty() && right.empty())
		{
			vec.push_back(left[0]);
			left.erase(left.begin());
		}
	}
}

int main()
{
	ifstream IN("algsort.in");
	ofstream OUT("algsort.out");

	int n;
	IN >> n;

	vector<int> vec;

	for (int i = 0; i < n; i++)
	{
		int x; IN >> x;
		vec.push_back(x);
	}

	MergeSort(vec);

	for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
	{
		OUT << *it << " ";
	}

	OUT << "\n";

	return 0;
}