Pagini recente » Borderou de evaluare (job #1981769) | Cod sursa (job #2329456)
#include <bits/stdc++.h>
#define int long long
const int MV(5e5 + 5) ;
int v[MV], L[MV >> 1], R[MV >> 1], n ;
void merge(int st, int dr) {
int mij = (dr + st) >> 1, i, j, k(st - 1) ;
int n1 = mij - st + 1 ;
int n2 = dr - mij ;
for (i = 1 ; i <= n1 ; ++ i)
L[i] = v[st + i - 1] ;
for (i = 1 ; i <= n2 ; ++ i) {
R[i] = v[mij + i] ;
}
i = j = 1 ;
while (i <= n1 && j <= n2) {
if (L[i] <= R[j]) {
v[++ k] = L[i] ;
++ i ;
} else {
v[++ k] = R[j] ;
++ j ;
}
}
while (i <= n1) {
v[++ k] = L[i ++] ;
}
while (j <= n2) {
v[++ k] = R[j ++] ;
}
}
void mergesort(int st, int dr) {
if (st >= dr)
return ;
mergesort(st, (dr + st) >> 1) ;
mergesort(((dr + st) >> 1) + 1, dr) ;
merge(st, dr) ;
}
int32_t main() {
freopen("algsort.in", "r", stdin) ;
freopen("algsort.out", "w", stdout) ;
int i ;
scanf("%lld", &n) ;
for (i = 1 ; i <= n ; ++ i) {
scanf("%lld", v + i) ;
}
mergesort(1, n) ;
for (i = 1 ; i <= n ; ++ i) {
printf("%lld ", v[i]) ;
}
return 0 ; }