Cod sursa(job #1207110)

Utilizator an_drey_curentandreycurent an_drey_curent Data 12 iulie 2014 11:49:02
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<stdio.h>
FILE *in, *out;
int N, *A;
void open()
{
	in = fopen("algsort.in", "rt");
	out = fopen("algsort.out", "wt");
}
void read()
{
	fscanf(in, "%d", &N);
	A = new int[N + 5];
	for (int i = 0; i < N; i++)
		fscanf(in, "%d", &A[i]);
}
void merge(int a_left, int a_right, int b_left, int b_right)
{
	int *r = new int[b_right - a_left + 1], i = a_left, j = b_left, k = 0;
	
	while (i <= a_right && j <= b_right)
	{
		if (A[i] == A[j])
		{
			r[k] = A[i];
			r[k + 1] = A[j];
			k += 2, i++, j++;
		}
		else if (A[i] < A[j])
		{
			r[k] = A[i];
			k++, i++;
		}
		else if (A[i] > A[j])
		{
			r[k] = A[j];
			k++, j++;
		}
	}
	while (i <= a_right)
	{
		r[k] = A[i];
		i++, k++;
	}
	while (j <= b_right)
	{
		r[k] = A[j];
		j++, k++;
	}

	for (i = 0; i < k; i++)
	{
		A[a_left + i] = r[i];
	}

	delete[] r;
}
void mergesort(int left, int right)
{
	if (left == right) return;
	int middle = (left + right) / 2;

	mergesort(left, middle);
	mergesort(middle + 1, right);

	merge(left, middle, middle + 1, right);
}
void write()
{
	for (int i = 0; i < N; i++)
		fprintf(out, "%d ", A[i]);
}
int main()
{
	open();
	read();
	mergesort(0, N - 1);
	write();
	return 0;
}