Cod sursa(job #281561)

Utilizator tomescu_alinTomescu Alin tomescu_alin Data 15 martie 2009 12:45:16
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 4.1 kb
/*
	Author:	Alin Tomescu
	Webpage:	http://alinush.isgreat.org
	Copyright:	Free to use and distribute as long as this note is kept
	Date:		12:44 PM Sunday, March 15, 2009
*/

#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;

#define NDEBUG

#ifdef NDEBUG
#define dbg	0 && (*((ostream *) 0))
#else
#define dbg clog
#endif

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, 0, vect.size());
		}
		
		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, Index begin, Index end) {
					static Vector merged(end-begin);
					
					if(end-begin <= 1) {
						return;
					} else {
						Index firstHalfSize = (end-begin)/2;
						
						mergeSort(vect, begin, begin + firstHalfSize);
						mergeSort(vect, begin + firstHalfSize, end);
						
						//	Merge the two sorted subvectors
						Size firstLength = begin + firstHalfSize, secondLength = end;	
						Index firstPos = begin, secondPos = begin + 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 = begin; j < end; j++)
							vect[j] = merged[j-begin];
					}
				}
		};
};

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);
	
	#ifndef NDEBUG
		if(!fin || !fout) {
			cerr << "Error opening one of \"" << inFile << "\" or \"" << outFile << "\"" << endl;
			return -1;
		}
	#endif
	
	/*
		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;
	
	dbg << "Sorting...\n";
	sorter(vect);
	dbg << "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;

}