Cod sursa(job #1232599)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 23 septembrie 2014 14:48:06
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;

inline void swap(int A[], int i, int j)
{
	int aux = A[i];
	A[i] = A[j];
	A[j] = aux;
}

void insertion_sort(int A[], int left, int right)
{
	for (int i = left + 1; i <= right; ++i) 
	{
		int e = A[i];
		int j = i;
		while (j > 0 && A[j-1] > e) 
		{
			A[j] = A[j-1];
			--j;
		}
			
		A[j] = e;
	}
}

inline int generate_random_number(int low, int high)
{
	int M = high - low + 1;
	int R = rand();
	
	return low + (R % M);	
}

int partition(int A[], int left, int right)
{
	int randomIndex = generate_random_number(left, right);
	
	swap(A, left, randomIndex);
	int pivot = A[left];
	int pivot_index = left;
	++left;
	
	while (left <= right)
	{
		while (left <= right && A[left] < pivot) ++left;
		while (right >= left && A[right] >= pivot) --right;
		
		if (left < right) swap(A, left++, right--);
	}
	
	swap(A, pivot_index, left - 1);
	
	return left - 1;
}

void quicksort(int A[], int left, int right)
{
	if (left < right) 
	{
		int p = partition(A, left, right);
		quicksort(A, left, p - 1);
		quicksort(A, p + 1, right);
	}
}

int main()
{
	ifstream ifs("algsort.in");
	ofstream ofs("algsort.out");
	
	srand(time(NULL));
	
	int A[500000], n;
	ifs >> n;
	
	for (int i = 0; i < n; ++i)	
		ifs >> A[i];
	
	//insertion_sort(A, 0, n-1);
	quicksort(A, 0, n-1);
	
	for (int i = 0; i < n; ++i)
		ofs << A[i] << " ";
	
	return 0;
}