Cod sursa(job #1335856)

Utilizator BonCipBonciocat Ciprian Mircea BonCip Data 5 februarie 2015 23:18:19
Problema Sortare prin comparare Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.95 kb
#include <stdio.h>
#define MAX 500000

int v[MAX];

void qsort(int b, int e)
{
	int aux;
	if (e - b > 3) {
		int piv = v[(b + e) / 2];
		int l = b - 1, r = e;
		while (l < r) {
			while (v[++l] < piv);
			while (v[--r] > piv);
			if (l < r) {
				aux = v[l];
				v[l] = v[r];
				v[r] = aux;
			}
		}
		qsort(b, l);
		qsort(l, e);
	} else if (e - b == 3) {
		if (v[b + 1] < v[b]) {
			aux = v[b + 1];
			v[b + 1] = v[b];
			v[b] = aux;
		}
		if (v[b + 2] < v[b]) {
			aux = v[b + 2];
			v[b + 2] = v[b];
			v[b] = aux;
		}
		if (v[b + 2] < v[b + 1]) {
			aux = v[b + 2];
			v[b + 2] = v[b + 1];
			v[b + 1] = aux;
		}
	} else if (e - b == 2) {
		if (v[b + 1] < v[b]) {
			aux = v[b + 1];
			v[b + 1] = v[b];
			v[b] = aux;
		}
	}
}

int main()
{
	freopen("algsort.in", "r", stdin);
	freopen("algsort.out", "w", stdout);
	int N;
	scanf("%d", &N);
	int i;
	for (i = 0; i < N; i++) {
		scanf("%d", v + i);
	}
	qsort(0, N);
	for (i = 0; i < N; i++) {
		printf("%d ", v[i]);
	}
}