Cod sursa(job #1452407)

Utilizator GilgodRobert B Gilgod Data 20 iunie 2015 18:44:47
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <ctime>

#define NMAX 500000

const char IN[] = "algsort.in", OUT[] = "algsort.out";

using namespace std;

int N;
int v[NMAX];

inline void swap(int poz1, int poz2) {
	if (&v[poz1] != &v[poz2]) {
		v[poz1] = v[poz1] ^ v[poz2];
		v[poz2] = v[poz2] ^ v[poz1];
		v[poz1] = v[poz1] ^ v[poz2];
	}
}

inline void readData() {
	freopen(IN, "r", stdin);
	scanf("%d", &N);
	for (int i = 0; i < N; ++i) {
		scanf(" %d", &v[i]);
	}
	fclose(stdin);
}

inline void partition(int low, int high, int pivot,
	int &lesser, int &higher) {
		while (low <= high) {
		while (v[low] < pivot) ++low;
		while (v[high] > pivot) --high;
		if (low <= high) swap(low++, high--);
	}
	lesser = low;	//limita superioara elementelor <pivot
	higher = high;  //limita inferioara elementelor >pivot
}

void qsort(int low, int high) {
	if (low == high - 1) (v[low] > v[high]) ? (swap(high, low)) : void();
	if (low == high) return;
	if (low < high) {
		int lesser, higher;
		int m = low + rand() % (high - low);
		partition(low, high, v[m], lesser, higher);
		if(low < higher) qsort(low, higher);
		if (high > lesser) qsort(lesser, high);
	}
}

int main() {
	readData();
	srand(time(NULL));
	qsort(0, N - 1);
	freopen(OUT, "w", stdout);
	for (int i = 0; i < N; ++i)
		printf("%d ", v[i]);
	printf("\n");
	fclose(stdout);
	return 0;
}