Cod sursa(job #1139044)

Utilizator cdt2014Cont de Teste cdt2014 Data 10 martie 2014 20:33:20
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

class Sorter {
public:
	Sorter(vector<int> V) : S(V) {
		srand(time(0));
		qsort(0, V.size() - 1);
	}

	int operator[](int i) { return S[i]; }

private:
	vector<int> S;

	void qsort(int a, int b) {
		// cerr << "SORTING " << a << " " << b << endl;
		if (a >= b) return;

		// for (int i=a; i<=b; ++i) cerr << S[i] << " "; cerr << endl;

		int pivot = rand() % (b-a) + a;
		int X = S[pivot];
		// cerr << "PIVOT " << pivot << " " << X << endl;
		for (int l=a, h=b; l<h; ) {
			if (S[l] > X) {
				swap(S[l], S[h]);
				--h;
			} else {
				++l;
			}
		}

		for (pivot=a; pivot < b; ++pivot) {
			if (S[pivot] == X) {
				if (S[pivot] > S[pivot+1]) {
					swap(S[pivot], S[pivot+1]);
				} else {
					break;
				}
			}
		}
		// for (int i=a; i<=b; ++i) cerr << S[i] << " "; cerr << endl;
		
		qsort(a, pivot-1);
		qsort(pivot + 1, b);
	}
};

int main() {
	ifstream in("algsort.in");
	ofstream out("algsort.out");

	int N;
	in >> N;
	vector<int> V(N);
	for (size_t i=0; i<N; ++i) {
		in >> V[i];
	}

	Sorter S(V);
	for (size_t i=0; i<N; ++i) out << S[i] << " ";
	out << "\n";
	return 0;
}