Cod sursa(job #1253891)

Utilizator dorinmoldovanMoldovan Dorin dorinmoldovan Data 1 noiembrie 2014 22:36:51
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include "stdio.h"

FILE *f, *g;
int n;
int a[500001];

int* merge(int* l1, int size1, int* l2, int size2) 
{
	int* c = new int[size1+size2+1];

	int i = 1;
	int j = 1;
	int k = 1;

	while(i <= size1 && j <= size2)
	{
		if(l1[i] > l2[j])
		{
			c[k++] = l2[j];
			j++;
		}
		else
		{
			c[k++] = l1[i];
			i++;
		}
	}

	for(int i1 = i; i1 <= size1; i1++)
		c[k++] = l1[i++];

	for(int j1 = j; j1 <= size2; j1++)
		c[k++] = l2[j++];

	return c;
}

int* merge_sort(int* a, int x, int y)
{
	if(x == y)
	{
		int* c = new int[2];
		c[1] = a[x];
		return c;
	}
	else if(y-x > 0)
	{
		int* l1 = merge_sort(a, x, (x+y) / 2);
		int* l2 = merge_sort(a, (x+y) / 2 + 1, y);
		
		int size1 = 0;
		int size2 = 0;

		if((x+y)/2 >= x)
			size1 = (x+y)/2 - x + 1;

		if(y >= (x+y)/2+1)
			size2 = y - (x+y)/2;

		int* l = merge(l1, size1, l2, size2);
		return l;
	}
}

int main() 
{
	f = fopen("algsort.in", "r");
	g = fopen("algsort.out", "w");

	fscanf(f, "%d", &n);
	for(int i = 1; i <= n; i++)
		fscanf(f, "%d", &a[i]);

	int* r = merge_sort(a, 1, n);

	for(int i = 1; i <= n; i++)
		fprintf(g, "%d ", r[i]);

	fclose(f);
	fclose(g);

	return 0;
}