Pagini recente » Cod sursa (job #1834412) | Cod sursa (job #1521675) | Cod sursa (job #1010468) | Cod sursa (job #803538) | Cod sursa (job #2316780)
// Inplace merge sort
#include <bits/stdc++.h>
using namespace std;
FILE *fin = freopen("algsort.in", "r", stdin);
FILE *fout = freopen("algsort.out", "w", stdout);
const int maxn = 1e5+2;
int n, a[maxn];
void merge(int left, int mid, int right) {
// create auxiliary arrays for left and right substrings
int l[maxn/2+2], r[maxn/2+2];
int nl = mid-left+1, nr = right-mid;
for (int i = 0; i < nl; ++ i)
l[i] = a[left+i];
for (int i = 0; i < nr; ++ i)
r[i] = a[mid+1+i];
// merge the subarrays
int i = 0, j = 0, k = left;
while(i < nl && j < nr) {
if (l[i] <= r[j]) {
a[k++] = l[i];
i++;
}
else {
a[k++] = r[j];
j++;
}
}
// concatenate the remaining numbers
for (; i < nl; ++ i)
a[k++] = l[i];
for (; j < nr; ++ j)
a[k++] = r[j];
}
void mergesort(int left, int right) {
// base case: one or zero elements
if (left >= right)
return;
int mid = left + (right - left)/2;
// sort the halfs
mergesort(left, mid);
mergesort(mid+1, right);
// sort the entire substring [left, tight]
// by merging the 2 halves
merge(left, mid, right);
}
int main() {
cin >> n;
for (int i = 0; i < n; ++ i)
cin >> a[i];
mergesort(0, n-1);
for (int i = 0; i < n; ++ i)
cout << a[i] << " ";
return 0;
}