Cod sursa(job #1333084)

Utilizator atoaderAlexandru Toader atoader Data 2 februarie 2015 19:18:29
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <stdint.h>
#include <limits>
#include <fstream>

using namespace std;

const uint32_t MAX_ELEMENTS = 500010;
uint32_t A[MAX_ELEMENTS];
uint32_t N;

void read()
{
	ifstream in("algsort.in");

	in >> N;

	for (uint32_t i = 1; i <= N; i++)
	{
		in >> A[i];
	}

	in.close();
}

void write()
{
	ofstream out("algsort.out");

	for (uint32_t i = 1; i <= N; i++)
	{
		out << A[i] << " ";
	}

	out.close();
}

void merge(uint32_t start, uint32_t middle, uint32_t end)
{
	uint32_t leftSize = middle - start + 1;
	uint32_t rightSize = end - middle;
	uint32_t *L = new uint32_t[leftSize + 1];
	uint32_t *R = new uint32_t[rightSize + 1];

	for (uint32_t i = 0; i < leftSize; i++)
	{
		L[i] = A[i + start];
	}

	for (uint32_t j = 0; j < rightSize; j++)
	{
		R[j] = A[j + middle + 1];
	}

	uint32_t i = 0, j = 0, k = 0;

	while (i < leftSize && j < rightSize){
		if (L[i] <= R[j])
		{
			A[start + k] = L[i];
			i++;
		}
		else
		{
			A[start + k] = R[j];
			j++;
		}

		k++;
	}

	while (i < leftSize){
		A[start + k] = L[i];
		i++;
		k++;
	}

	while (j < rightSize){
		A[start + k] = R[j];
		j++;
		k++;
	}

	delete L;
	delete R;
}

void mergeSort(uint32_t start, uint32_t end)
{
	if (start<end){
		uint32_t middle = (start + end) / 2;
		mergeSort(start, middle);
		mergeSort(middle + 1, end);
		merge(start, middle, end);
	}

}

void sort()
{
	mergeSort(1, N);
}

int main()
{
	read();
	sort();
	write();
}