Cod sursa(job #804973)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 30 octombrie 2012 19:21:31
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb

#include <cstdio>
#include <cstdlib>
#include <ctime>

const int MAX_SIZE(500000);

int v [MAX_SIZE];
int n;

inline void read (void)
{
	std::freopen("algsort.in","r",stdin);
	std::scanf("%d",&n);
	for (int *iterator(v), *end(v + n) ; iterator < end ; ++iterator)
		std::scanf("%d",iterator);
	std::fclose(stdin);
}

inline void print (void)
{
	std::freopen("algsort.out","w",stdout);
	for (int *iterator(v), *end(v + n) ; iterator < end ; ++iterator)
		std::printf("%d ",*iterator);
	std::putchar('\n');
	std::fclose(stdout);
}

inline void quicksort (int left, int right)
{
	std::srand(std::time(0));
	const int STACK_SIZE(100);
	struct interval
	{
		int left;
		int right;
	} stack [STACK_SIZE], *top(stack + 1);
	stack[1].left = left;
	stack[1].right = right;
	int i, j, pivot, temp;
	do
	{
		i = left = top->left;
		j = right = top->right;
		pivot = v[left + (std::rand() % (right - left + 1))];
		while (i <= j)
		{
			while (v[i] < pivot)
				++i;
			while (v[j] > pivot)
				--j;
			if (i <= j)
			{
				temp = v[i];
				v[i] = v[j];
				v[j] = temp;
				++i;
				--j;
			}
		}
		--top;
		if (left < j)
		{
			++top;
			top->left = left;
			top->right = j;
		}
		if (right > i)
		{
			++top;
			top->left = i;
			top->right = right;
		}
	}
	while (top > stack);
}

int main (void)
{
	read();
	quicksort(0,n-1);
	print();
	return 0;
}