Cod sursa(job #2276721)

Utilizator theo2003Theodor Negrescu theo2003 Data 5 noiembrie 2018 11:01:36
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");
void qsort(vector<long long int> &i, int l, int r) {
	if(((r - l)==1)) {
		if(i[l]>i[r])
			swap(i[l], i[r]);

		return;
	}

	if((r - l)<=0)
		return;
	else {
		int pivot;
		{
			int pivot_1 = i[(l + (r - l + 1)/2)];
			int pivot_2 = i[l + (r - l + 1)/3];
			int pivot_3 = i[l + (r - l + 1)/3*2];

			if((pivot_1>pivot_2)&&(pivot_1<pivot_3))
				pivot = pivot_1;
			else
				if((pivot_2>pivot_1)&&(pivot_2<pivot_3))
					pivot = pivot_2;
				else
					pivot = pivot_3;
		}
		vector<long long int> new_list_1;
		vector<long long int> new_list_2;
		int pvt = 0;

		for(int x = l; x<=r; x++) {
			if(i[x]==pivot)
				pvt++;
			else
				if(i[x]<pivot)
					new_list_1.push_back(i[x]);
				else
					new_list_2.push_back(i[x]);
		}

		for(unsigned int x = l, y = 0; y<new_list_1.size(); x++) {
			i[x] = new_list_1[y];
			y++;
		}

		for(int x = l + new_list_1.size(), y = 0; y<pvt; x++) {
			i[x] = pivot;
			y++;
		}

		for(int x = l + new_list_1.size() + pvt, y = 0; x<=r; x++) {
			i[x] = new_list_2[y];
			y++;
		}

		qsort(i, l, l + new_list_1.size() - 1);
		qsort(i, l + new_list_1.size() + pvt, r);
	}
}
int main() {
	int n;
	in>>n;
	vector<long long int> l(n);
    //return 0;
	for(int x = 0; x<n; x++)
		in>>l[x];

	qsort(l, 0, n - 1);

	for(int x = 0; x<n; x++)
		out<<l[x]<<' ';
}