Cod sursa(job #3179788)

Utilizator SilviuIIon Silviu SilviuI Data 4 decembrie 2023 10:54:40
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <vector>

using namespace std;

typedef pair<int, int> pii;

pii partition(vector<int> &a, int l, int r)
{
	int sz = (r - l + 1);
	
	int m = l + rand() % sz;
	int item_m = a[m];
	
	int cnt_l = 0, cnt_b = 0;
	
	for (int i = l; i <= r; i++)
		if (a[i] < item_m) cnt_l++; else
			if (a[i] > item_m) cnt_b++;
	
	int x = l;
	int y = r;
	
	while (true)
	{
		// look for a[x] >= item_m
		while (x <= y && a[x] < item_m) x++;
		
		// look for a[y] <= item_m
		while (y >= x && a[y] > item_m) y--;
		
		if (x >= y) break;
		
		swap(a[x], a[y]);
	}
	
	return { l + cnt_l, r - cnt_b };
}

void quicksort(vector<int> &a, int l, int r)
{
	if (l >= r) return;
	
	pii pivot = partition(a, l, r);
	
	quicksort(a, l, pivot.first - 1);
	quicksort(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];
	
	quicksort(in, 0, (int)in.size() - 1);
	
	for (auto item: in) cout << item << ' ';
	
	return 0;
}