#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>v;
int n;
void buble_sort(void);
void insert_sort(void);
void quick_sort(int l, int r);
void merge_sort(int l, int r);
int nixudui_merge_sort(int l, int r);
int main() {
cin >> n;
v.resize(n);
for (int i = 0; i < n; i++)
cin >> v[i];
//buble_sort();//冒泡排序
//insert_sort();//插入排序
//希尔排序,堆排序省略
quick_sort(0, n - 1);//快速排序
//merge_sort(0, n - 1);//归并排序
//int res = nixudui_merge_sort(0, n - 1);//逆序对mergesort;
//cout << res << endl;//逆序对
//bucket_sort();//桶排序
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
return 0;
}
void buble_sort(void) {
for (int p = n - 1; p > 0; p--)
for (int i = 0; i + 1 <= p; i++)
if (v[i] > v[i + 1])swap(v[i], v[i + 1]);
}
void insert_sort(void) {
for (int p = 1; p < n; p++) {
int temp = v[p],i;
for (i = p; i > 0 && v[i - 1] > temp; i--)
v[i] = v[i - 1];
v[i] = temp;
}
}
void quick_sort(int l,int r) {
if (l >= r)return;
int left = l, right = r;
int x = v[l + r >> 1];
while (l < r) {
while (v[l] < x)l++;
while (v[r] > x)r--;
if (l < r)swap(v[l], v[r]);
else quick_sort(left, l), quick_sort(l + 1, right);
}
}
void merge_sort(int l, int r) {
if (l >= r)return;
int mid = l + r >> 1;
merge_sort(l, mid);
merge_sort(mid + 1, r);
vector<int>temp;
int p1 = l, p2 = mid + 1;
while (p1 != mid + 1 && p2 != 1 + r)
if (v[p1] > v[p2]) temp.push_back(v[p2++]);
else temp.push_back(v[p1++]);
while (p1 != mid + 1) temp.push_back(v[p1++]);
while (p2 != r + 1) temp.push_back(v[p2++]);
for (int i = l, j = 0; i <= r; i++, j++)v[i] = temp[j];
}
int nixudui_merge_sort(int l, int r) {
if (l >= r)return 0;
int mid = l + r >> 1;
int res = 0;
res += nixudui_merge_sort(l, mid);
res += nixudui_merge_sort(mid + 1, r);
vector<int>temp;
int p1 = l, p2 = mid + 1;
while (p1 != mid + 1 && p2 != 1 + r)
if (v[p1] > v[p2]) {
temp.push_back(v[p2++]);
res += mid - p1 + 1;
}else temp.push_back(v[p1++]);
while (p1 != mid + 1) temp.push_back(v[p1++]);
while (p2 != r + 1) temp.push_back(v[p2++]);
for (int i = l, j = 0; i <= r; i++, j++)v[i] = temp[j];
return res;
}
void bucket_sort(void) {
vector<vector<int>>bucket;
for (int i = 1; i <= 3; i++) {//假设所有数字都<=999
vector<int>temp;
for (int j = 0; j < v.size(); j++) {
int num = check(v[j], i);//获取v[j]的i位数,对于456,1位为4,3位为6
bucket[num].push_back(v[j]);
}
for (int j = 0; j < 10; j++)
for (int k = 0; k < bucket[j].size(); k++)
temp.push_back(bucket[j][k]);
for (int i = 0; i < n; i++)
v[i] = temp[i];
}
}
#include<iostream>
#include<algorithm>
using namespace std;
typedef node tree;
struct node
{
int data;
tree left;
tree right;
};
int main() {
tree head;
quick_sort(head, NULL);//[)
head = merge_sort(head);
}
void quick_sort(tree left, tree right) {//链表的快排
tree slow = left;
tree fast = left;
int temp = left->data;
while (fast != right) {
if (fast->data <= temp) {
slow = slow->next;
swap(fast->data, slow->data);
}
fast = fast->data;
}
quick_sort(left, slow->next);
quick_sort(slow->next, right);
}
tree merge_sort(tree head) {//链表的归并算法
if (head)return NULL;
tree slow = head;
tree fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
tree temp = slow->next;
slow->next = NULL;//分化为两个链表然后拼接起来
tree left = merge_sort(left);
tree right = merge_sort(temp);
tree head = build(left, right);
}
tree build(tree left, tree right) {
if (!left)return right;
if (!right)return left;
if (left->data < right->data) {
left->next = build(left->next, right);
return left;
}else {
right->next = build(left, right->next);
return right;
}
}