Pagini recente » Cod sursa (job #2822615) | Cod sursa (job #548555) | Cod sursa (job #1228983) | Cod sursa (job #2611423) | Cod sursa (job #412305)
Cod sursa(job #412305)
/* 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;
}