#include <fstream>
using namespace std;
int medianOf3(int *array, const int &a, const int &b, const int &c) {
if (array[a] > array[b]) {
if (array[b] > array[c]) {
return b;
} else {
return c;
}
} else {
if (array[a] > array[c]) {
return a;
} else {
return c;
}
}
}
int partition(int *array, const int &left, const int &right) {
int pivot = medianOf3(array, left, right, (left + right) / 2);
int pivot_value = array[pivot];
swap(array[pivot], array[right]);
int rightmost_lesser = left;
for (int i = left; i < right; ++i) {
if (array[i] < pivot_value) {
swap(array[rightmost_lesser], array[i]);
++rightmost_lesser;
}
}
swap(array[right], array[rightmost_lesser]);
return rightmost_lesser;
}
void quickSort(int *array, const int &left, const int &right) {
if (left < right) {
int pivot = partition(array, left, right);
quickSort(array, left, pivot - 1);
quickSort(array, pivot + 1, right);
}
}
int main() {
int N, i, *array;
ifstream in("algsort.in");
in >> N;
array = new int[N];
for (i = 0; i < N; ++i) {
in >> array[i];
}
in.close();
quickSort(array, 0, N - 1);
ofstream out("algsort.out");
for (i = 0; i < N; ++i) {
out << array[i] << " ";
}
out.close();
delete[] array;
return 0;
}