package mergeSort;
import java.util.*;
public class Main {
/*
* 递归的归并排序
*/
public void mergeSort(int[] num, int left, int right) {
int[] tmp = new int[10001];
if (left < right) {
int i = (left + right) / 2;
mergeSort(num, left, i);
mergeSort(num, i + 1, right);
merge(num, tmp, left, i, right);
copy(num, tmp, left, right);
}
}
/*
* 非递归的归并排序
*/
public void mergeSort(int[] num,int n) {
int[] tmp = new int[n];
int s = 1;
while (s < num.length) {
mergePass(num, tmp, s,n);
s += s;
mergePass(tmp, num, s,n);
s += s;
}
}
/*
* 一趟归并排序
*/
public void mergePass(int[] num, int[] tmp, int s,int n) {
int i = 0;
while (i <= n - 2 * s) {
merge(num, tmp, i, i + s - 1, i + 2 * s - 1);
i = i + 2 * s;
}
if (i + s < n)
merge(num, tmp, i, i + s - 1, n - 1);
else {
for (int j = i; j < n; j++)
tmp[j] = num[j];
}
}
/*
* 合并num[left:mid]和num[mid+1:right]到tmp[left:right]
*/
public void merge(int[] num, int[] tmp, int left, int mid, int right) {
int i = left;
int j = mid + 1;
int k = left;
while ((i <= mid) && (j <= right)) {
if (num[i] <= num[j])
tmp[k++] = num[i++];
else
tmp[k++] = num[j++];
if (i > mid) {
for (int q = j; q <= right; q++)
tmp[k++] = num[q];
} else if (j > right)
for (int q = i; q <= mid; q++)
tmp[k++] = num[q];
}
}
/*
* 复制tmp[left:right]到num[left:right]
*/
public void copy(int[] num, int[] tmp, int left, int right) {
for (int i = left; i <= right; i++) {
num[i] = tmp[i];
}
}
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n;
int[] num = new int[10001];
Main main = new Main();
n = sc.nextInt();
for (int i = 0; i < n; i++) {
num[i] = sc.nextInt();
}
main.mergeSort(num,n);
for (int i = 0; i < n; i++)
System.out.println(num[i]);
}
}