Cod sursa(job #995383)

Utilizator KatyiaKatyia Katyia Data 8 septembrie 2013 20:29:56
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <fstream>
#include <vector>

using namespace std;

class Sortable {
private:

	vector<unsigned int> numbers_;
	const unsigned int size_;

 	void merge(unsigned int left, unsigned int median, unsigned int right) {
 		vector<unsigned int> merged_halves;

 		unsigned int first_half_index = left;
 		unsigned int second_half_index = median + 1;
 		
 		while (first_half_index <= median && second_half_index <= right) {
 				if (numbers_[first_half_index] < numbers_[second_half_index]) {
 					merged_halves.push_back(numbers_[first_half_index]);
 					first_half_index++;
 				} else {
 					merged_halves.push_back(numbers_[second_half_index]);
 					second_half_index++;
 				}
 		}

 		while (first_half_index <= median) {
 			merged_halves.push_back(numbers_[first_half_index]);
 			first_half_index++;
 		}

 		while (second_half_index <= right) {
 			merged_halves.push_back(numbers_[second_half_index]);
 			second_half_index++;
 		}

 		unsigned int copy_index;
 		unsigned int merged_halves_index;
 		for (copy_index = left, merged_halves_index = 0; copy_index <= right; 
 			copy_index++, merged_halves_index++) {
 			numbers_[copy_index] = merged_halves[merged_halves_index];
 		}
 	}


 	void recursion(unsigned int left, unsigned int right) {
 		if (left >= right) return;

 		const unsigned int median = (left + right) / 2;

 		recursion(left, median);
 		recursion(median + 1, right);

 		merge(left, median, right);
 	}

 public:
	Sortable(unsigned int size, const vector<unsigned int>& numbers) : size_(size) {
		numbers_ = numbers;
	}

	vector<unsigned int> numbers() {
		return numbers_;
	}

	void sort() {
		recursion(0, size - 1);
	}
};

ifstream in("algsort.in");
ofstream out("algsort.out");

int main() {
	
	unsigned int size;
	unsigned int element;
	vector<unsigned int> numbers;
	in>>size;

	for (unsigned int i = 0; i < size; i++) {
		in >> element;
		numbers.push_back(element);
	}

	Sortable sortable(size, numbers);
	sortable.sort();
	numbers = Sortable.numbers();

	for (unsigned int i = 0; i < size; i++) {
		out << numbers[i] << " ";
	}
	return 0;
}