Cod sursa(job #782729)

Utilizator BitOneSAlexandru BitOne Data 29 august 2012 14:54:15
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <vector>
#include <cstdlib>
#include <fstream>
#include <iterator>
#include <algorithm>

using namespace std;

int *aux;
vector<int> v;

inline void swap(int &x, int &y) {int aux = x; x = y; y = aux;}

void InsertionSort(int start, int end)
{
	int i, j;
	
	for(i=start+1; i <= end; ++i)
	{
		for(j = i; j > start && v[j] < v[j-1]; --j)
			swap(v[j], v[j-1]);
	}
}

void MergeSort(int left, int right)
{
	if(left >= right)
		return;
	else if(1 == right - left)
	     {
		    if(v[right] < v[left])
			  swap(v[right], v[left]);
		 }
		 else if(right - left <= 8)
		     {
				InsertionSort(left, right);
			 }
			 else {
						int i, j, k;
			            int middle = left + ((right - left)>>1);
						
						MergeSort(left, middle);
						MergeSort(middle+1, right);
						
						if(v[middle] <= v[middle+1])
							return;
						
						copy(v.begin()+left, v.begin()+right+1, aux+left);
						
						for(i = k = left, j = middle + 1; k <= right; ++k)
						{
							if(i <= middle)
							{
								if(j <= right)
								{
									if(aux[i] <= aux[j])
									{
										v[k] = aux[i];
										++i;
									}
									else {
											v[k] = aux[j];
											++j;
										 }
								}
								else {
										 v[k] = aux[i];
										 ++i;
									 }
							}
							else {
							        v[k] = aux[j];
									++j;
							     }
							
						}
						
						
			      }
} 

int main()
{
	int N;
	
	ifstream in("algsort.in");
	ofstream out("algsort.out");
	
	in>>N;
	aux = new int[N];
	copy(istream_iterator<int>(in), istream_iterator<int>(), back_inserter(v));
	
	MergeSort(0, N-1);
	
	copy(v.begin(), v.end(), ostream_iterator<int>(out, " "));
	out<<'\n';
	
	delete[] aux;	
	return EXIT_SUCCESS;
}