Pagini recente » Diferente pentru home intre reviziile 759 si 760 | Cod sursa (job #342785) | Cod sursa (job #611919) | Istoria paginii runda/hc_round1 | Cod sursa (job #412316)
Cod sursa(job #412316)
/* 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 vec[ maxn], temp[maxn];
int n;
void merge( int left, int middle, int right)
{
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)
{
if( right - left <= 1)
{
if( vec[left] > vec[ right] )
vec[ right ] = vec[left] - vec[right] + ( vec[left] = vec[right]);
return ;
}
merge_sort( left, (left + right)/2);
merge_sort( ( left + right)/2 + 1, right);
merge( left, ( left + right)/2, right);
}
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",&vec[i]);
//cin>>vec[i];
}
merge_sort(1,n);
for( int i = 1; i < n; ++i)
printf("%d ",vec[i]);
printf("%d\n",vec[n]);
return 0;
}