Cod sursa(job #2316780)

Utilizator KaryamKaryam Ahmad Karyam Data 12 ianuarie 2019 13:39:40
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
// 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;
}