#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
//冒泡排序
void bubble_sort(vector<int> &q)
{
for (int i = q.size() - 1; i > 0; i--)
{
for (int j = 0; j + 1 <= i; j++)
{
if (q[j] > q[j + 1]) swap(q[j], q[j + 1]);
}
}
}
//选择排序:每次选择最小的放在前面
void selection_sort(vector<int> &q) {
for (int i = 0; i < q.size(); i++)
{
for (int j = i + 1; j < q.size(); j++) //错误:j开始时的取值
{
if (q[i] > q[j]) swap(q[i], q[j]);
}
}
}
//冒泡排序优化
void bubble_sort(vector<int> &q) //&
{
for (int i = q.size() - 1; i > 0; i--)
{
bool flag = false;
for (int j = 0; j + 1 <= i; j++)
{
if (q[j] > q[j + 1]) swap(q[j], q[j + 1]), flag = true;
}
if (!flag) break;
}
}
//插入排序
void insersionSort(vector<int> &q)
{
for (int i = 1; i < q.size(); i++)
{
int j, t = q[i];
for (j = i - 1; j >= 0; j--) // >
{
if (q[j] > t) q[j + 1] = q[j];
else break;
}
q[j + 1] = t;
}
}
//归并排序
void merge_sort(vector<int> &q, int l, int r)
{
if (l >= r) return;
int mid = (l + r) / 2;
merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);
static vector<int> w;
w.clear();
int i = l, j = mid + 1;
while (i <= mid && j <= r)
{
if (q[i] < q[j]) w.push_back(q[i]), i++;
else w.push_back(q[j]), j++;
}
while (j <= r) w.push_back(q[j]), j++; //
while (i <= mid) w.push_back(q[i]), i++;
for (int i = l, j = 0; j < w.size(); i++, j++) q[i] = w[j];
}
//快排模板1
void quick_sort(vector<int> &q, int left, int right)
{
if (left >= right) return;
int l = left, r = right;
int k = q[l];
while (l < r)
{
while (k <= q[r] && l < r) r--;
while (q[l] <= k && l < r) l++;
if (l < r) swap(q[l], q[r]);
}
q[left] = q[l];
q[l] = k;
quick_sort(q, left, l - 1);
quick_sort(q, r + 1, right);
}
//解决思考题 逆序对
int merge_sort(vector<int> &q, int l, int r)
{
if (l >= r) return 0;
int res = 0; //记录当前逆序对个数
int mid = (l + r) / 2;
res += merge_sort(q, l, mid); //左半边逆序对个数 (内部的)
res += merge_sort(q, mid + 1, r); //右半边逆序对个数
static vector<int> w; //左右排完用辅助数组存一下
w.clear();
int i = l, j = mid + 1; //开始归并
while (i <= mid && j <= r)
if (q[i] <= q[j])
w.push_back(q[i++]);
else
{
res += mid - i + 1;
w.push_back(q[j++]);
}
while (i <= mid) w.push_back(q[i ++]);
while (j <= r) w.push_back(q[j ++]);
for (i = l, j = 0; j < w.size(); i++, j++) q[i] = w[j];
return res;
}
//快速排序
void quick_sort(vector<int>&q, int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j)
{
do j--; while (q[j] > x);
do i++; while (q[i] < x);
if (i < j) swap(q[i], q[j]);
else quick_sort(q, l, j), quick_sort(q, j+1, r);
}
}
int main()
{
vector<int> q;
int n;
cin >> n;
for (int i = 0, t; i < n; i++)
{
cin >> t;
q.push_back(t);
}
//bubble_sort(q);
//selectionSort(q);
//inserttionSort(q);
//merge_sort(q, 0, q.size() - 1);
//cout << merge_sort(q, 0, q.size() - 1) << endl;
quick_sort(q, 0, q.size() - 1);
for (auto x : q) cout << x << ' ';
cout << endl;
return 0;
}
//堆排
//堆:满足某种性质的完全二叉树 大跟堆 小跟堆
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void push_down(vector<int> &heap, int size, int u) //u更新元素当前下标
{
int t = u, left = u * 2, right = u * 2 + 1; //t存最小值
if (left <= size && heap[left] > heap[t]) t = left;
if (right <= size && heap[right] > heap[t]) t = right;
if (t != u)
{
swap(heap[u], heap[t]);
push_down(heap, size, t);
}
}
void push_up(vector<int> &heap, int u)
{
while (u / 2 && heap[u / 2] < heap[u])
{
swap(heap[u / 2], heap[u]);
u /= 2;
}
}
void remove_top(vector<int> &heap, int &size)
{
heap[1] = heap[size]; //最后一个元素覆盖到
size--;
push_down(heap, size, 1);
}
void heap_sort(vector<int> &q, int n)
{
int size = n;
for (int i = 1; i <= n; i++) push_up(q, i);
for (int i = 1; i <= n; i++)
{
swap(q[1], q[size]);
size--;
push_down(q, size, 1);
}
}
int main()
{
vector<int> q;
int n;
cin >> n;
q.resize(n + 1);
for (int i = 1; i <= n; i++) cin >> q[i];
heap_sort(q, n);
for (int i = 1; i <= n; i++) cout << q[i] << ' '; cout << endl;
return 0;
}