Cod sursa(job #1311399)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 8 ianuarie 2015 02:13:38
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <algorithm>
#include <math.h>
using namespace std;

const int Nmax = 500005;
const int Lmax = 50000;
const int inf = 1;

int n;
int v[Nmax];
int u[Nmax];
int batog[Lmax];
int interval_len;
int nr_interval;

void update_interval(int k) {
	// Get maximum element from an interval
	int t = (k - 1) * interval_len;
	int x = t + 1;
	for (int j = 2; j <= interval_len && j + t <= n; ++j)
		if (v[x] < v[t + j])
			x = t + j;
	batog[k] = x;
}

int main() {
	freopen("algsort.in", "r", stdin);
	freopen("algsort.out", "w", stdout);


	scanf("%d", &n);
	for (int i = 1; i <= n; ++i)
		scanf("%d", &v[i]);

	// Set interval length and number of intervals
	interval_len = 500;
	if (!interval_len)
		interval_len = 1;
	nr_interval = n / interval_len;
	if (nr_interval * interval_len < n) ++nr_interval;

	// Build initial Smen of Batog array
	for (int i = 1; i <= nr_interval; ++i)
		update_interval(i);

	int k = n;
	for (int i = 1; i <= n; ++i) {
		// Get maximum element from vector
		int x = 1;
		for (int j = 2; j <= nr_interval; ++j)
			if (v[ batog[x] ] < v[ batog[j] ])
				x = j;
		// Add element to sorted array and update batog
		u[k--] = v[ batog[x] ];
		v[ batog[x] ] = -inf;
		update_interval(x);
	}

	// Print sorted vector
	for (int i = 1; i <= n; ++i)
		printf("%d ", u[i]);
	printf("\n");

	return 0;
}