Cod sursa(job #412305)

Utilizator marius135Dumitran Adrian Marius marius135 Data 5 martie 2010 14:41:24
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
/* sortare prin interclasare, 
    Pornim cu un vector mare nesortat si il tot impartim in 2 jumatati. Facem acest lucru pana jaungem la bucatele mici 
pe care le sortam usor. Apoi interclasam bucatelele sortate pt  a obtine zone sortate din ce in ce mai mari.


*/
#include<stdio.h>
#include<iostream.h>
#define maxn 1024 * 512
int v[ maxn], temp[maxn];
int n;

void merge( int left, int middle, int right, int *vec, int *temp)
{
	for( int a1 = left, a2 = middle+1, i = left; i <= right; ++i)
	{
		if( a1 > middle)
		{
			temp[i] = vec[a2++];
			continue;
		}
		if( a2 > right)
		{
			temp[i] = vec[a1++];
			continue;
		}
		if( vec[a1] < vec[ a2 ])
		{
			temp[i] = vec[a1++];
			continue;
		}
		temp[i] = vec[ a2++];
	}
	for( int i = left; i <= right; ++i)
		vec[i] = temp[i];
}

void merge_sort( int left, int right, int *vec, int *temp)
{
	if( right - left <= 3)
	{
		for( int i = 1; i <= n; ++i)
			for( int j = left; j < right; ++j)
				if( vec[j] > vec[ j + 1] )
					vec[ j + 1 ] = vec[j] - vec[j+1] + ( vec[j] = vec[j+1]);
		return ;
	}
	merge_sort( left, (left + right)/2, vec, temp);
	merge_sort( ( left + right)/2 + 1, right, vec, temp);
	merge( left, ( left + right)/2, right, vec, temp);
}

int main()
{
	freopen("algsort.in","r",stdin); freopen("algsort.out","w",stdout);
	
	//scanf("%d",&n);
	cin>>n;
	
	for( int i = 1; i <= n; ++i)
	{
		//scanf("%d",&v[i]);
		cin>>v[i];
	}
	
	merge_sort(1,n, v, temp);
	for( int i = 1; i < n; ++i)
		printf("%d ",v[i]);
	printf("%d\n",v[n]);
	return 0;
}