Cod sursa(job #281554)

Utilizator tomescu_alinTomescu Alin tomescu_alin Data 15 martie 2009 12:30:39
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 4.47 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

typedef unsigned char byte;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef unsigned long long ulonglong;

template<class T>
class Sort {
	public:
		typedef std::vector<T> Vector;
		typedef void (*FuncPtr)(Vector& vect);
		typedef typename Vector::difference_type Index;
		typedef typename Vector::size_type Size;
		
	public:
		
		static void Merge(Vector& vect) {
			Sort::Helper::mergeSort(vect, vect.begin(), vect.end());
		}
		
		static void Quick(Vector& vect) {
			
		}
		
		static void StlQuickSort(Vector& vect) {
			sort(vect.begin(), vect.end());
		}
		
		static void Heap(Vector& vect) {
			
		}
		
		static void Intro(Vector& vect) {
			
		}
		
		static void Bubble(Vector& vect) {
			bool sorted;
			Size size = vect.size();
			
			do {
				sorted = true;
				for(Index i = 0; i < size-1; i++) {
					if(vect[i] > vect[i+1]) {
						swap(vect[i], vect[i+1]);
						sorted = false;
					}
				}
			} while(!sorted);
		}
		
		static void Select(Vector& vect) {
			Size size = vect.size();
			Index swapIndex;
			
			for(Index i = 0; i < size-1; i++) {
				swapIndex = i;
				
				for(Index j = i+1; j < size; j++) {
					if(vect[swapIndex] > vect[j]) {
						swapIndex = j;
					}
				}
				
				if(swapIndex != i) {
					swap(vect[i], vect[swapIndex]);
				}
			}
			
		}
		
		static void Insertion(Vector& vect) {		
			Size size = vect.size();
			
			for(Index i = 1; i < size; i++) {
				T data = vect[i];
				Index j = i-1;
				
				while(j >= 0 && vect[j] > data) {
					vect[j+1] = vect[j];
					j--;
				}
				
				vect[j+1] = data;
			}
		}
		
	public:
		class Helper {
			public:
				static void mergeSort(Vector& vect, typename Vector::iterator begin, typename Vector::iterator end) {
					static Vector merged(end-begin);
					Index beginIndex = begin-vect.begin(), endIndex = end - vect.begin();
					
					// clog << "improvedMergeSort(begin: " << beginIndex << ", end: " << endIndex << ")" << endl;
					
					if(end-begin <= 1) {
						// clog << "begin <= end <=> " << beginIndex << " <= " << endIndex << endl;
						return;
					} else {
						Index firstHalfSize = (end-begin)/2;
						
						// clog << "Half size: " << firstHalfSize << endl;
						
						// clog << "Left: ";
						// copy(begin, begin+firstHalfSize, ostream_iterator<T>(clog, " "));
						// clog << endl;
						
						// clog << "Right: ";
						// copy(begin+firstHalfSize, end, ostream_iterator<T>(clog, " "));
						// clog << endl;
						
						mergeSort(vect, begin, begin + firstHalfSize);
						mergeSort(vect, begin + firstHalfSize, end);
						
						//	Merge the two sorted subvectors
						Size firstLength = beginIndex + firstHalfSize, secondLength = endIndex;	
						Index firstPos = beginIndex, secondPos = beginIndex + firstHalfSize;
						Index i = 0;
						
						while(firstPos < firstLength && secondPos < secondLength) {
							if (vect[firstPos] < vect[secondPos]) {
								merged[i++] = vect[firstPos++];
							} else {
								merged[i++] = vect[secondPos++];
							}
						}

						while (firstPos < firstLength) {
							merged[i++] = vect[firstPos++];
						}
						while (secondPos < secondLength) {
							merged[i++] = vect[secondPos++];
						}
						
						//	Copy back into original vector
						for(int j = beginIndex; j < endIndex; j++)
							vect[j] = merged[j-beginIndex];
					}
				}
		};
};

int main(int argc, char * argv[]) {
	
	/*
		Open up the files...
	*/
	const char * inFile = "algsort.in";
	const char * outFile = "algsort.out";
	
	ifstream fin(inFile);
	ofstream fout(outFile);
	
	// if(!fin || !fout) {
		// cerr << "Error opening one of \"" << inFile << "\" or \"" << outFile << "\"" << endl;
		// return -1;
	// }
	
	/*
		Read in the number of elements in the vector
		And then read each element
	*/
	ulong n;
	fin >> n;
	std::vector<ulong> vect(n);
	
	for(ulong i = 0; i < n; i++) {
		fin >> vect[i];
	}
	
	/*
		Choose your sorting algorithm.
		Sort!
	*/
	Sort<ulong>::FuncPtr sorter = Sort<ulong>::Merge;
	
	//clog << "Sorting...\n";
	sorter(vect);
	//clog << "Sorted!";
	
	//	Store the sorted vector in a file
	ostream& target = fout;	
	copy(vect.begin(), vect.end(), ostream_iterator<ulong>(target, " "));
	
	fout.close();
	fin.close();
	
	return 0;

}