Cod sursa(job #384763)

Utilizator zalmanDanci Emanuel Sebastian zalman Data 20 ianuarie 2010 21:27:03
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
#include <algorithm>
#define NMAX 500010
using namespace std;

int N, v[NMAX], i;

void read(void)
{
	freopen("algsort.in", "r", stdin);
	scanf("%d", &N);
	for(i = 1; i <= N; ++i)
		scanf("%d", &v[i]);
	
	fclose(stdin);
}
void interclas(int ls, int mij, int ld)
{
	int i, j, k;
	int c[NMAX];
	
	i = ls;
	j = mij + 1;
	k = 0;
	
	while(i <= mij && j <= ld)
		if(v[i] <= v[j])
			c[++k] = v[i++];
		else
			c[++k] = v[j++];
	
	++k;	
	if(i <= mij)
		for( ;i <= mij; ++i, ++k)
			c[k] = v[i];
	
	if(j <= ld)
		for( ; j <= ld; ++j, ++k)
			c[k] = v[j];
		
	
	for(i = ls, j = 1; i <= ld; ++i, ++j)
		v[i] = c[j];
		
}
void mergeSort(int ls, int ld)
{
	int mij;
	if(ld - ls <= 1)
	{	
		if(v[ls] > v[ld])
			swap(v[ls], v[ld]);
	}
	else
	{
		mij = (ls + ld) / 2;
		mergeSort(ls, mij);
		mergeSort(mij + 1, ld);
		interclas(ls, mij, ld);
	}
		
}
void print(void)
{
	freopen("algsort.out", "w", stdout);
	for(i = 1; i <= N; ++i)
		printf("%d ", v[i]);
	fclose(stdout);
}
int main(void)
{
	read();
	mergeSort(1, N);
	print();
	
	return 0;
}