#include <algorithm>
#include <cstdio>
#include <iterator>
#include <cassert>
#include <ctime>
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
}
}
void QuickSort( int arr[], int first, int last ) {
if(first >= last)
return;
int pivIdx = rand() * (last - first - 1) / RAND_MAX + first;
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");
srand((unsigned int)time(NULL));
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;
}