Cod sursa(job #1284891)

Utilizator Mihai96Saru Mihai Mihai96 Data 6 decembrie 2014 22:03:29
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.39 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

const char NUME_FISIER_INTRARE[] = "algsort.in";
const char NUME_FISIER_IESIRE[] = "algsort.out";
const int  QUICKSORT_THRESHOLD = 15;

vector<int> *citesteNumere(const char filename[]){
	ifstream fin(filename);
	int n;
	fin >> n;
	vector<int> *numere = new vector<int>(n);

	for(int i = 0; i < (*numere).size(); ++i){
		fin >> (*numere)[i];
	}
	fin.close();

	return numere;
}

int median(vector<int> *numere, int start, int end){
	int center = start + (end-start)/2;
	if((*numere)[start] > (*numere)[center]){
		swap((*numere)[start], (*numere)[center]);
	}
	if((*numere)[center] > (*numere)[end]){
		swap((*numere)[center], (*numere)[end]);
	}
	if((*numere)[start] > (*numere)[center]){
		swap((*numere)[start], (*numere)[center]);
	}
	
	swap((*numere)[start+1], (*numere)[center]);

	return (*numere)[start+1];
}

int partitie(vector<int> *numere, int start, int end){
	int pivot = median(numere, start, end);
	int i = start + 1; //primul element este deja la locul lui, al doilea este pivotul iar while=ul incrementa
				//i-ul si apoi il va folosi
	int j = end;       //ultimul element este deja la locul lui, while-ul va incrementa j-ul si apoi il va folosi
	
	while(true){
		while((*numere)[++i] < pivot);
		while((*numere)[--j] > pivot);


		if(i >= j){
			break;
		}
		swap((*numere)[i], (*numere)[j]);
	}
	swap((*numere)[start+1], (*numere)[j]);

	return j;
}

void insertionSort(vector<int> *numere, int start, int end){
	for(int i = start + 1; i <= end; ++i){
		int j = i;
		while(j > start && (*numere)[j-1] > (*numere)[j]){
			swap((*numere)[j-1], (*numere)[j]);
			--j;
		}
	}
}

void quickSort(vector<int> *numere, int start, int end){
	if(start >= end - QUICKSORT_THRESHOLD){
		insertionSort(numere, start, end);
		return;
	}

	int pivot = partitie(numere, start, end);
	quickSort(numere, start    , pivot - 1);
	quickSort(numere, pivot + 1, end);
}

void sort(vector<int> *numere){
	//wrapper quicksort
	quickSort(numere, 0, (*numere).size() - 1);
}

void scrieNumere(const char filename[], vector<int> *numere){
	//scrie numerele
	ofstream fout(filename);
	for(int i = 0; i < (*numere).size(); ++i){
		fout << (*numere)[i] << " ";
	}
	fout.close();
}

int main(int argc, char *argv[]){
	vector<int> *numere;
	
	numere = citesteNumere(NUME_FISIER_INTRARE);
	sort(numere);
	scrieNumere(NUME_FISIER_IESIRE, numere);

	delete numere;
	return 0;
}