#include <algorithm>
#include <cstdio>
#include <iterator>
#include <cassert>
using namespace std;
// Most significant digit radix sort (recursive)
void MSDRadix ( int arr[], int begin, int end, int msb = 31 ) {
if (begin != end && msb >= 0) {
int mid = std::partition(arr + begin, arr + end, [&msb](int value){if (msb == 31) return value < 0; else return !(value & (1 << msb)); }) - arr;
--msb; // decrement most-significant-bit
MSDRadix(arr, begin, mid, msb); // sort left partition
MSDRadix(arr, mid, end, msb); // sort right partition
}
}
void QuickSort( int arr[], int begin, int end ) {
if(begin >= end)
return;
int pivot = arr [(begin + end - 1) >> 1];
std::swap(arr [(begin + end - 1) >> 1], arr[end - 1]);
int mid = std::partition ( arr + begin, arr + end - 1, [&pivot] (int value) { return value < pivot; } ) - arr;
std::swap(arr[mid], arr[end - 1]);
QuickSort(arr, begin, mid);
QuickSort(arr, mid + 1, end);
}
void Merge(int a[], int begin, int mid, int end) {
int i = begin;
int j = mid;
int k = 0;
int *temp = new int[end - begin];
while (i < mid && j < end) {
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 < end; ++l)
temp[k++] = a[l];
for (int l = begin; l < end; ++l)
a[l] = temp[l - begin];
delete[] temp;
}
void MergeSort(int a[], int begin, int end) {
if (begin < end - 1) {
int mid = (begin + end) / 2;
MergeSort(a, begin, mid);
MergeSort(a, mid, end);
Merge(a, begin, mid, end);
}
}
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;
}