Cod sursa(job #3001889)

Utilizator AndreiV03Andrei Voicu AndreiV03 Data 14 martie 2023 00:46:52
Problema Sortare prin comparare Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdlib>
#include <fstream>
#include <iostream>
using namespace std;

ifstream in("algsort.in");
ofstream out("algsort.out");

const int MAXN = 500001;

int v[MAXN];
int dr[MAXN];
int st[MAXN];
int mij[MAXN];
int n;

void swap(int& a, int& b) {
	if (&a == &b) return;
	a ^= b;
	b ^= a;
	a ^= b;
}

void quicksort(int spos = 0, int dpos = n - 1) {
	int stack[MAXN];
	int top = -1;
	stack[++top] = spos;
	stack[++top] = dpos;
	while (top >= 0) {
		dpos = stack[top--];
		spos = stack[top--];
		if (dpos - spos <= 0) continue;
		int m = 0, s = 0, d = 0;
		int p = v[spos];
		for (int i = spos; i <= dpos; i++) {
			if (v[i] > p)
				dr[d++] = v[i];
			if (v[i] < p)
				st[s++] = v[i];
			if (v[i] == p)
				mij[m++] = v[i];
		}
		int k = 0;
		for (int i = spos; i < spos + s; i++) {
			v[i] = st[k++];
		}
		k = 0;
		for (int i = spos + s; i < spos + s + m; i++) {
			v[i] = mij[k++];
		}
		k = 0;
		for (int i = spos + s + m; i < spos + s + d + m; i++) {
			v[i] = dr[k++];
		}
		// Push subarrays onto stack
		stack[++top] = spos;
		stack[++top] = spos + s - 1;
		stack[++top] = spos + s + m;
		stack[++top] = dpos;
	}
}

int main() {
	ios::sync_with_stdio(false);
	in >> n;
	for (int i = 0; i < n; i++) {
		in >> v[i];
	}
	quicksort();
	for (int i = 0; i < n; i++) {
		out << v[i] << " ";
	}
}