#include<iostream>
#include<vector>
using namespace std;
//两个相等的数^会等于0
/*
void swap(int& a, int& b)
{
a = a^b;
b = a^b;
a = a^b;
}
*/
void swap(int& a, int& b)
{
int c = a;
a = b;
b = c;
}
void bubble_sort(vector<int> &numbers)
{
for (int i = 0; i < numbers.size(); i++)
{
for (int j = 0; j < numbers.size() - i - 1 && numbers[j] > numbers[j+1]; j++)
{
swap(numbers[j], numbers[j + 1]);
}
}
}
void insert_sort(vector<int> &numbers)
{
for (int i = 0; i < numbers.size(); i++)
{
for (int j = i; j > 0 && numbers[j] < numbers[j-1]; j--)
{
swap(numbers[j], numbers[j - 1]);
}
}
}
void select_sort(vector<int> numbers)
{
int minIdx = 0;
for (int i = 0; i < numbers.size(); i++)
{
for (int j = i + 1; j < numbers.size() && numbers[j] < numbers[minIdx]; j++)
{
minIdx = j;
}
swap(numbers[i], numbers[minIdx]);
}
}
void shell_sort(vector<int>& numbers)
{
int increment = numbers.size();
while(increment > 1)
{
increment = increment / 3 + 1; //增量公式 可选择其他方法
for (int i = increment; i < numbers.size(); i++)
{
int j = i;
while (j-increment >= 0)
{
if (numbers[j] < numbers[j - increment])
{
swap(numbers[j], numbers[j - increment]);
}
j = j - increment;
}
}
}
}
void quick_sort(vector<int>& numbers, int left, int right)
{
if (left > right)
return;
int i = left;
int j = right;
int tmp = numbers[left];
while(i != j)
{
while (numbers[j] >= tmp && i < j)
j--;
while (numbers[i] <= tmp && i < j)
i++;
if (i < j)
{
swap(numbers[i], numbers[j]);
}
}
swap(numbers[left], numbers[i]);
quick_sort(numbers, left, i - 1);
quick_sort(numbers, i + 1, right);
}
void merge(vector<int>& numbers, int first, int mid, int last, vector<int>& tmp)
{
int i = first, j = mid+1, k = first;
while (i <= mid && j <= last)
{
if (numbers[i] < numbers[j])
{
tmp[k++] = numbers[i++];
}
else
{
tmp[k++] = numbers[j++];
}
}
while (i <= mid)
{
tmp[k++] = numbers[i++];
}
while (j <= last)
{
tmp[k++] = numbers[j++];
}
for (i = first; i < last; i++)
{
numbers[i] = tmp[i];
}
}
//注意last为数组里能取到的最后一位,不然递归循环会死循环
void merge_sort_helper(vector<int>& numbers,int first, int last, vector<int>& tmp)
{
if (first < last)
{
int mid = (first + last) / 2;
merge_sort_helper(numbers, first, mid, tmp);
merge_sort_helper(numbers, mid+1, last, tmp); //注意mid+1
merge(numbers, first, mid, last, tmp);
}
}
void merge_sort(vector<int>& numbers)
{
vector<int> tmp(numbers.size(), 0);
merge_sort_helper(numbers, 0, numbers.size()-1, tmp);
}
void head_adjust(vector<int>& numbers,int len, int i)
{
int left = 2 * i + 1;
int right = 2 * i + 2;
int maxIdx = i;
if (left<len && numbers[left] > numbers[maxIdx]) maxIdx = left;
if (right<len && numbers[right] > numbers[maxIdx]) maxIdx = right;
if (maxIdx != i)
{
swap(numbers[i], numbers[maxIdx]);
head_adjust(numbers, len, maxIdx);
}
}
void head_sort(vector<int>& numbers)
{
//建堆
for (int i = numbers.size() / 2; i >= 0; i--)
{
head_adjust(numbers, numbers.size(),i);
}
//排序
for (int i = numbers.size() - 1; i >= 0; i--)
{
swap(numbers[0], numbers[i]);
head_adjust(numbers, i, 0);
}
}
int main()
{
vector<int> a;
char ch;
int num;
while (cin >> num)
{
a.push_back(num);
if ((ch = cin.get()) == '\n')
break;
}
//bubble_sort(a);
//insert_sort(a);
//shell_sort(a);
//quick_sort(a,0,a.size()-1);
//merge_sort(a);
head_sort(a);
for (int i = 0; i < a.size(); i++)
{
cout << a[i] << endl;
}
return 0;
}