Cod sursa(job #2692045)

Utilizator vali_27Bojici Valentin vali_27 Data 31 decembrie 2020 12:09:51
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>

int v[500000], n;


int mediana(int st, int dr) {
	int mid = (st + dr) / 2;
	if ((v[st] > v[mid]) ^ (v[st] > v[dr]))
	{
		int t = v[mid];
		v[mid] = v[st];
		v[st] = t;
	}
	else
	if ((v[dr] > v[st]) ^ (v[dr] > v[mid]))
	{
		int t = v[mid];
		v[mid] = v[dr];
		v[dr] = t;
	}

	if (v[st] > v[dr])
	{
		int t = v[st];
		v[st] = v[dr];
		v[dr] = t;
	}
	return v[mid];
}

void print()
{
	std::cout << '\n';
	for (int i = 0; i < n; ++i)
		std::cout << v[i] << ' ';
	std::cout << '\n';
}
int pivot(int st, int dr)
{
	int piv = mediana(st, dr);
	int i = st, j = dr;
	while (true)
	{
		while (v[i] < piv)i++;
		while (v[j] > piv)j--;
 
		if (i >= j)
			return j;
		
		int t = v[i];
		v[i] = v[j];
		v[j] = t;
		i++, j--;
	}
}


void quicksort(int st, int dr) {
	if (st < dr) {
		int p = pivot(st, dr);
		quicksort(st, p);
		quicksort(p + 1, dr);
	}
}

int main() {
	std::ifstream f("algsort.in");
	f >> n;
	for (int i = 0; i < n; ++i)
		f >> v[i];
	f.close();

	quicksort(0, n - 1);
	
	std::ofstream g("algsort.out");
	for (int i = 0; i < n; ++i)
		g << v[i] << ' ';
	g.close();
}