Pagini recente » Cod sursa (job #662597) | Cod sursa (job #2172355) | Cod sursa (job #2748735) | Cod sursa (job #2861834) | Cod sursa (job #3001889)
#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] << " ";
}
}