Cod sursa(job #505405)

Utilizator sunt_emoSunt emo sunt_emo Data 2 decembrie 2010 03:55:38
Problema Sortare prin comparare Scor 60
Compilator c Status done
Runda Arhiva educationala Marime 0.78 kb
#include <stdio.h>

void q_sort (long*,long,long);
void swap (long*,long,long);
long partition (long*,long,long);

int main () {
	long a[500010],i,n;
	freopen ("algsort.in","r",stdin);
	freopen ("algsort.out","w",stdout);
	scanf ("%ld",&n);
	for (i=0; i<n; i++) scanf ("%ld",a+i);
	q_sort (a,0,n);
	for (i=0; i<n-1; i++) printf ("%ld ",a[i]);
	printf ("%ld\n",a[n-1]);
	return 0;
}

void q_sort (long *a,long l,long r) {
	if (l<r) {
		int k=partition (a,l,r);
		q_sort (a,l,k);
		q_sort (a,k+1,r);
	}
}

void swap (long *a,long x,long y) {
	long z=a[x]; a[x]=a[y]; a[y]=z;
}

long partition (long *a,long l,long r) {
	long p=l,q;
	swap (a,(2*l+r)/3,r-1);
	for (q=l; q<r-1; q++)
		if (a[q]<=a[r-1]) {
			swap (a,p,q);
			p++;
		}
	swap (a,p,r-1);
	return p;
}