#include <fstream>
using namespace std;
// Hoare's partition
int partition(int *v, const int &left, const int &right, const int &piv) {
int i = left - 1, j = right + 1, piv_val = v[piv];
while (1) {
do {
++i;
} while (v[i] < piv_val);
do {
--j;
} while (v[j] > piv_val);
if (i < j) {
swap(v[i], v[j]);
++i; --j;
} else {
return j;
}
}
}
void quickSort(int *v, const int &left, const int &right) {
if (left < right) {
int piv = left + rand() % (right - left + 1); // pivot randomziat
piv = partition(v, left, right, piv);
quickSort(v, left, piv - 1);
quickSort(v, piv + 1, right);
}
}
int main() {
int N, i, *v;
ifstream in("algsort.in");
in >> N;
v = new int[N];
for (i = 0; i < N; ++i) {
in >> v[i];
}
in.close();
quickSort(v, 0, N - 1);
ofstream out("algsort.out");
for (i = 0; i < N; ++i) {
out << v[i] << " ";
}
out.close();
delete[] v;
return 0;
}