Cod sursa(job #1311196)

Utilizator radudorosRadu Doros radudoros Data 7 ianuarie 2015 20:30:21
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <algorithm>
#include <math.h>
#define NMAX 500001
#define NMIC 9001
using namespace std;

struct limite
{
	int st, dr;
};

int v[NMAX];
int min[NMIC];
int elr[NMIC];
limite lim[NMIC];

ifstream fin("algsort.in");
ofstream fout("algsort.out");

int main()
{
	int n;
	fin >> n;
	for (int i = 1; i <= n; i++)
		fin >> v[i];
	int h = sqrt(n);
	int n2 = n / h;
	for (int i = 1; i <= n2; i++)
	{
		elr[i] = h;
	}
	if (n%h != 0)
	{
		n2++;
		elr[n2] = n - (n / h*h);
	}
	//Elemente ramase rezolvat


	for (int i = 1; i <= n2; i++)
	{
		int min2 = 10000;
		int minpoz = (i-1)*h+1;
		for (int j = (i - 1)*h + 1; j <= i*h; j++)
		{
			if (j > n)
				break;
			if (v[j] < min2)
			{
				min2 = v[j];
				minpoz = j;
			}
		}
		v[minpoz] = 10000;
		elr[i]--;
		if (min2 == 10000)
		{
			elr[i] = 0;
		}
		min[i] = min2;
	}

	for (int i = 1; i <= n; i++)
	{
		int min2 = min[1];
		int poz = 1;
		for (int j = 1; j <= n2; j++)
		{
			if (min[j] < min2)
			{
				min2 = min[j];
				poz = j;
			}
		}
		fout << min2 << ' ';

		min2 = 10000;
		int minpoz = (poz-1)*h+1;
		for (int j = (poz - 1)*h + 1; j <= poz*h; j++)
		{
			if (j > n)
				break;
			if (v[j] < min2)
			{
				min2 = v[j];
				minpoz = j;
			}
		}
		v[minpoz] = 10000;
		elr[i]--;
		if (min2 == 10000)
		{
			elr[poz] = 0;
		}
		min[poz] = min2;
	}
}