Cod sursa(job #818694)

Utilizator unholyfrozenCostea Andrei unholyfrozen Data 17 noiembrie 2012 20:36:34
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <cstdlib>

using namespace std;

const int too_small = 50;
#define MIN(a, b) (a < b ? a : b)
#define MAX(a, b) (a > b ? a : b)

void insertsort (int *Array, int num_elem) {
	for (int i = 1; i < num_elem; i++) {
		int elem = Array[i], j;
		for (j = i; j > 0 && Array[j - 1] > elem; j--) {
			Array[j] = Array[j - 1];
		}
		Array[j] = elem;
	}
}

void quicksort (int* Array, int num_elem) {
	if (num_elem < too_small) {
		insertsort (Array, num_elem);
		return;
	}
	
	int first = 0;
	int last = num_elem - 1;
	int mid = num_elem >> 1;
	// int pivot = Array[first] >= MIN(Array[last], Array[mid]) && Array[first] <= MAX(Array[last], Array[mid]) ? first :
	//	Array[last] >= MIN(Array[first], Array[mid]) && Array[last] <= MAX(Array[first], Array[mid]) ? last :
	//												       mid;
	pivot = rand() % num_elem;
	int temp, pivotIndex;
	temp = Array[pivot];
	Array[pivot] = Array[num_elem - 1];
	Array[num_elem - 1] = temp;
	pivotIndex = 0;
	
	for (int i = 0; i < num_elem - 1; i++) {
		if (Array[i] < Array[num_elem - 1]) {
			temp = Array[pivotIndex];
			Array[pivotIndex] = Array[i];
			Array[i] = temp;
			pivotIndex++;
		}
	}

	temp = Array[pivotIndex];
	Array[pivotIndex] = Array[num_elem - 1];
	Array[num_elem - 1] = temp;
	
	quicksort(Array, pivotIndex);
	quicksort(Array + pivotIndex + 1, num_elem - pivotIndex - 1);					
}

int main()
{
	ifstream read ( "algsort.in", ifstream::in);
	ofstream write ( "algsort.out", ofstream::out);
	
	int num_elem;
	int *Array;

	read >> num_elem;
	Array = new int[num_elem];

	for (int i = 0; i < num_elem; i++)
		read >> Array[i];
	
	quicksort(Array, num_elem);
	
	for (int i = 0; i < num_elem; i++)
		write << Array[i] << (i == num_elem - 1 ? "\n" : " ");

	return 0;
}