#include <algorithm>
#include <cstdio>
#include <iterator>
#include <cassert>
using namespace std;
// Most significant digit radix sort (recursive)
void MSDRadix ( int arr[], int first, int last, int msb = 31 ) {
if (first != last && msb >= 0) {
int *mid = std::partition(arr + first, arr + last, [&msb](int value){if (msb == 31) return value < 0; else return !(value & (1 << msb)); });
msb--; // decrement most-significant-bit
MSDRadix(arr, first, mid - arr, msb); // sort left partition
MSDRadix(arr, mid - arr, last, msb); // sort right partition
}
}
int Median3( int const arr[], int a, int b, int c ) {
int ans = a;
if(arr[a] <= arr[b] && arr[b] <= arr[c])
ans = b;
if(arr[b] <= arr[c] && arr[c] <= arr[a])
ans = c;
return ans;
}
void QuickSort( int arr[], int first, int last ) {
if(first >= last)
return;
int pivIdx = Median3(arr, first, (first + last - 1) / 2, last - 1);
int pivot = arr [pivIdx];
std::swap(arr [pivIdx], arr[last - 1]);
int mid = std::partition ( arr + first, arr + last - 1, [&pivot] (int value) { return value < pivot; } ) - arr;
std::swap(arr[mid], arr[last - 1]);
QuickSort(arr, first, mid);
QuickSort(arr, mid + 1, last);
}
void Merge(int a[], int low, int mid, int high) {
int i = low;
int j = mid;
int k = 0;
int *temp = new int[high - low];
while (i < mid && j < high) {
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++]=a[j++];
}
for (int l = i; l < mid; l++)
temp[k++] = a[l];
for (int l = j; l < high; l++)
temp[k++] = a[l];
for (int l = low; l < high; l++)
a[l] = temp[l - low];
delete[] temp;
}
void MergeSort(int a[], int low, int high) {
if (low < high - 1) {
int mid = (low + high) / 2;
MergeSort(a, low, mid);
MergeSort(a, mid, high);
Merge(a, low, mid, high);
}
}
int const MAX = 500009;
int data[MAX], dataSize;
int main () {
FILE *fin = fopen("algsort.in", "r");
FILE *fout = fopen("algsort.out", "w");
fscanf(fin, "%d", &dataSize);
for(int i = 0; i < dataSize; ++i)
fscanf(fin, "%d", data + i);
QuickSort(data, 0, dataSize);
for(int i = 0; i < dataSize; ++i)
fprintf(fout, "%d ", data[i]);
fclose(fin);
fclose(fout);
return 0;
}