Cod sursa(job #818676)

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

using namespace std;

const int too_small = 25;
#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] > Array[j]; 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;
	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 - 1);
	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;
}