Cod sursa(job #971295)

Utilizator cont_de_testeCont Teste cont_de_teste Data 8 iulie 2013 21:22:39
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;

const int NMax = 500100;
const int oo = 0x3f3f3f3f;
int N;
vector<int> A(NMax), norm;

void readVector(vector<int> &, int);
void sortVector(vector<int> &, int, int);
void writeVector(vector<int> &, int);

int main() {
	#ifdef INFOARENA
		freopen("algsort.in", "r", stdin);
		freopen("algsort.out", "w", stdout);
	#endif
	scanf("%i", &N);
	readVector(A, N);
	sortVector(A, 1, N);
	writeVector(A, N);
}

void readVector(vector<int> &A, int length) {
	for (int i = 1; i <= length; i++)
		scanf("%i", &A.at(i));
}

void sortVector(vector<int> &A, int left, int right) {
	if (left == right)
		return ;
	int middle = left + (right - left) / 2;
	sortVector(A, left, middle);
	sortVector(A, middle + 1, right);
	
	int p1 = left, p2 = middle + 1;
	norm.clear();
	while (p1 <= middle || p2 <= right) {
		int value1, value2;
		if (p1 <= middle)
			value1 = A.at(p1);
		else value1 = oo;
		if (p2 <= right)
			value2 = A.at(p2);
		else value2 = oo;
		if (value1 < value2) {
			norm.push_back(value1); p1++;
		} else {
			norm.push_back(value2); p2++;
		}
	}
	
	for (int i = left; i <= right; i++)
		A.at(i) = norm.at(i - left);
}

void writeVector(vector<int> &A, int length) {
	for (size_t i = 1; i <= length; i++)
		printf("%i ", A.at(i));
}