Cod sursa(job #572917)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 5 aprilie 2011 18:54:52
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>
#include <fstream.h>
#define DIM 500001
ifstream f("algsort.in");
FILE *g=fopen("algsort.out","w");
int n;
int v[DIM],b[DIM];
int ii=0,jj=-1,aux;
long pos(long i,long j){
	ii=0,jj=-1;
	while(i!=j){
		if(v[i]>v[j]){
			aux=v[i];
			v[i]=v[j];
			v[j]=aux;
			aux=ii;
			ii=-jj;
			jj=-aux;
		}
		i+=ii;
		j+=jj;
	}
	return i;
}

void quick(long p,long u){
	if(p<u){
		long k=pos(p,u);
		quick(p,k-1);
		quick(k+1,u);
	}
}

void interclas(int p,int m,int u){
	register int i=p,j=m+1;
	int q=p-1;
	while(i<=m && j<=u)
		if(v[i]<v[j])
			b[++q]=v[i++];
		else
			b[++q]=v[j++];
	
	for(;i<=m;)
		b[++q]=v[i++];
	for(;j<=u;){
		b[++q]=v[j++];
	}
	for(i=p;i<=u;i++){
		v[i]=b[i];
	}
}

void merge(int p,int u){
	if(p<u){
		int m=(p+u)/2;
		merge(p,m);
		merge(m+1,u);
		interclas(p,m,u);
	}
}

int main(void){
	register int i;
	
	f>>n;
	for(i=1;i<=n;i++){
		f>>v[i];
	}
	//quick(1,n);
	merge(1,n);
	for(i=1;i<=n;i++){
		fprintf(g,"%ld ",v[i]);
	}
	f.close();
	fclose(g);
	return 0;
}