Cod sursa(job #1452397)

Utilizator GilgodRobert B Gilgod Data 20 iunie 2015 18:21:37
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

#define INF 0x3f3f3f3f

const char IN[] = "algsort.in", OUT[] = "algsort.out";
const int NMAX = 500000;

using namespace std;

int V[NMAX];
int N;

inline void vswap(int i, int j) {
	if (&V[i] == &V[j]) return;
	V[i] = V[i] ^ V[j];
	V[j] = V[j] ^ V[i];
	V[i] = V[i] ^ V[j];
}

inline void read_data() {
	freopen(IN, "r", stdin);
	scanf("%d", &N);
	for (int i = 0; i < N; ++i) {
		scanf("%d", &V[i]);
	}
	fclose(stdin);
}

inline void merge(int low, int m, int high) {
	int *L = new int[m - low + 2];
	L[m - low + 1] = INF;
	int *R = new int[high - m + 1];
	R[high - m] = INF;
	memcpy(L, V + low , (m - low + 1) * sizeof(int));
	memcpy(R, V + (m + 1), (high - m) * sizeof(int));
	int i = 0, j = 0;
	int k = low;
	while (k <= high) {
		if (L[i] < R[j]) V[k++] = L[i++];
		else V[k++] = R[j++];
	}
	delete[] L;
	delete[] R;
}

void merge_sort(int low, int high) {
	if (low == high - 1) {
		if (V[low] > V[high]) vswap(low, high);
		return;
	}
	if (low == high) return;
	int m = low + ((high - low) >> 1);
	merge_sort(low, m);
	merge_sort(m + 1, high);
	merge(low, m, high);
}

int main() {
	read_data();
	merge_sort(0, N-1);
	freopen(OUT, "w", stdout);
	for (int i = 0; i < N; ++i)
		printf("%d ", V[i]);
	printf("\n");
	fclose(stdout);
	return 0;
}