Cod sursa(job #810617)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 10 noiembrie 2012 16:41:33
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb

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

const int MAX_SIZE(500000);

int n;
int v [MAX_SIZE];

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);
}

int partition (int left, int right)
{
	int pivot(left + std::rand() % (right - left + 1)), temp;
	temp = v[pivot];
	v[pivot] = v[right];
	v[right] = temp;
	pivot = v[right];
	int store(left), index(left);
	while (index < right)
	{
		if (v[index] <= pivot)
		{
			temp = v[store];
			v[store] = v[index];
			v[index] = temp;
			++store;
		}
		++index;
	}
	temp = v[store];
	v[store] = v[right];
	v[right] = temp;
	return store;
}

void quicksort (int left, int right)
{
	if (left < right)
	{
		int pivot(partition(left,right));
		quicksort(left,pivot - 1);
		quicksort(pivot + 1,right);
	}
}

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