Cod sursa(job #3179599)

Utilizator SilviuIIon Silviu SilviuI Data 3 decembrie 2023 22:13:50
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <set>
#include <iostream>
#include <vector>
#include <array>
#include <queue>
#include <unordered_map>
#include <bitset>
#include <algorithm>
#include <iomanip>

#define INF 1e9

using namespace std;

typedef long long int ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;

pii partition(vector <int> &a, int l, int r)
{
	int sz = r - l + 1;

	int m = l + rand() % sz; // 0..(sz - 1)
	int m_item = a[m];
	int m_count = 0;

	vector <int> lower;
	vector <int> higher;

	for (int i = l; i <= r; i++)
		if (a[i] < m_item) lower.push_back(a[i]); else
			if (a[i] > m_item) higher.push_back(a[i]); else
				m_count++;

	int x = l, pos = l;

	for (int i = 0; i < lower.size(); i++) a[x++] = lower[i];

	for (int i = 0; i < m_count; i++) a[x++] = m_item;

	for (int i = 0; i < higher.size(); i++) a[x++] = higher[i];

	return { l + lower.size(), r - higher.size() };
}

void quick_sort(vector <int> &a, int l, int r)
{
	if (l >= r) return;

	pii pivot = partition(a, l, r);

	quick_sort(a, l, pivot.first - 1);
	quick_sort(a, pivot.second + 1, r);
}

int main() 
{
	freopen("algsort.in", "r", stdin);
	freopen("algsort.out", "w", stdout);

	int n;
	cin >> n;

	vector <int> in(n);

	for (int i = 0; i < n; i++) cin >> in[i];

	quick_sort(in, 0, n - 1);

	for (auto item: in) cout << item << ' ';
	
	return 0;
}