Cod sursa(job #808215)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 6 noiembrie 2012 15:14:25
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <ctime>
#include <cstdlib>

using namespace std;

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

const int N=510000;

int n;
int v[N];

void MergeSort(int left,int right){
	if(left>=right){
		return;
	}
	int m=(left+right)/2;
	MergeSort(left,m); // sort each half
	MergeSort(m+1,right);
	int *aux;
	aux=new int[right+1];
	int k=left,lcursor=left,rcursor=m+1;
	while(lcursor<=m && rcursor<=right){
		if(v[lcursor]<v[rcursor]){
			aux[k++]=v[lcursor++];
		}
		else{
			aux[k++]=v[rcursor++];
		}
	}
	while(lcursor<=m){
		aux[k++]=v[lcursor++];
	}
	while(rcursor<=right){
		aux[k++]=v[rcursor++];
	}	
	for(int i=left;i<=right;++i){
		v[i]=aux[i];
	}
	delete aux;
}

void Quicksort(int left,int right){
	if(left>=right)
		return;
	int randpivot=(rand()%(right-left))+left;
	swap(v[left],v[randpivot]);
	int pivot=v[left];
	int l=left+1,r=right;
	while(l<r){
		if(v[l]>pivot){
			swap(v[l],v[r]);
			r--;
			continue;
		}
		l++;
	}
	if(v[l]<=pivot){
		swap(v[l],v[left]);
		Quicksort(left,l-1);
		Quicksort(l+1,right);
	}
	else{
		swap(v[l-1],v[left]);
		Quicksort(left,l-2);
		Quicksort(l,right);
	}		
}

int main(){
	int i;
	in>>n;
	for(i=1;i<=n;++i){
		in>>v[i];
	}
	Quicksort(1,n);
	for(i=1;i<=n;++i){
		out<<v[i]<<" ";
	}
}