Cod sursa(job #1684437)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 11 aprilie 2016 01:14:13
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <vector>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;

#ifdef INFOARENA
#define ProblemName "algsort"
#endif

#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif

#define MAXN 500010
int v[MAXN];

int g_seed = 0x123456;
inline int fastrand() {
	g_seed = (214013 * g_seed + 2531011);
	return (g_seed >> 16) & 0x7FFF;
}

int partition(int left, int right) {
	int pivot = left + rand() % (right - left);
	//int pivot = (left + right) >> 1;
	swap(v[pivot], v[right - 1]);
	pivot = v[right - 1];
	int lindex = left, rindex = right - 2;
	while (lindex <= rindex) {
		while (v[lindex] < pivot && lindex < right) ++lindex;
		while (v[rindex] > pivot && rindex >= left) --rindex;
		if (lindex <= rindex) {
			swap(v[rindex], v[lindex]);
			++lindex, --rindex;
		}
	}
	swap(v[lindex], v[right - 1]);
	return lindex;
}

int quickFind(int left, int right, int val) {
	if (left >= right - 1) return 0;
	int p = partition(left, right);
	quickFind(left, p, 0);
	quickFind(p, right, 0);
	return 0;
}

int main() {
	assert(freopen(InFile, "r", stdin));
	assert(freopen(OuFile, "w", stdout));
	int N;
	scanf("%d", &N);
	for (int i = 0; i < N; i++)
		scanf("%d", &v[i]);
	quickFind(0, N, 0);
	for (int i = 0; i < N; i++)
		printf("%d ", v[i]);
	return 0;
}