//快速排序 模板
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, q[N];
//(个人)取左边值为 pivot , 将大于 pivot 放在右边, 小于的放在左边
int part(int q[], int l, int r)
{
int i = l, j = r, pivot = q[l];
while(i < j)
{
while(i < j && q[j] > pivot)j --;// j -- 目的是找到不满足的 q[j]
if (i < j)swap(q[i++],q[j]);// 交换后 j 不动,此时不确定q[i]是否满足
while(i < j && q[i] < pivot)i ++;// i ++ 目的是找到不满足的 q[i]
if (i < j)swap(q[i],q[j--]);// 交换后 i 不动,此时不确定q[j]是否满足
//反正就是j -- 就 i ++ ; i ++ 就 j --
}
return i;
}
void quick_sort(int q[],int l,int r)
{
int mid;
if(l < r)
{
mid = part(q, l, r);
quick_sort(q, l, mid-1);// 递归
quick_sort(q, mid+1, r);
}
}
int main()
{
scanf("%d",&n);
for (int i = 1;i <= n;i ++) scanf ("%d", &q[i]);
quick_sort(q, 1, n);
for (int i = 1;i <= n;i ++) printf ("%d ", q[i]);
return 0;
}
// 归并排序 模板
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
int q[N], a[N];
// 对 A , B 两个数组比大小排序到 a 数组
void merge(int l, int mid , int r)
{
int i = l, j = mid + 1, k = l;
while(i <= mid && j <= r)
{
if (q[i] < q[j]) a[k ++] = q[i ++];
else a[k ++] = q[j ++];
}
while (i <= mid) a[k ++] = q[i ++];// A 数组没排序完的继续排序
while (j <= r) a[k ++] = q[j ++];// B 数组没排序完的继续排序
//for (int i = l;i <= r;i ++) q[i] = a[i];
}
// 将一组数组对半分,
void merge_sort(int l , int r)
{
if (l >= r) return ;// 特判
int mid = (l + r) / 2;
merge_sort(l, mid);// A 数组
merge_sort(mid + 1, r);// B 数组
merge(l, mid, r);
}
int main()
{
scanf ("%d", &n);
for (int i = 1;i <= n;i ++) scanf ("%d", &q[i]);
merge_sort(1, n);
for (int i = 1;i <= n;i ++) printf ("%d ", a[i]);
// for (int i = 1;i <= n;i ++) printf ("%d ", q[i]);
return 0;
}
训练网址:
【模板】排序 - 洛谷力扣https://leetcode.cn/problems/sort-an-array/description/