快速排序——分治
步骤:
- 确定分界点值x:取q[l],q[r],q[(l+r)/2],随机;
- 调整区间:小于x在左边;大于x在右边;
- 递归处理左右两边。
代码:
#define _CRT_SECURE_NO_WARNINGS//用于解决vs2022使用scanf报错
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int q[N];
void quick_sort(int q[], int l,int r)
{
if (l >= r) return;
int x = q[l], i = l - 1,j = r + 1;
while (i < j)
{
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if (i < j)
swap(q[i], q[j]);
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &q[i]);
quick_sort(q, 0, n - 1);
for (int i = 0; i < n; i++)
printf("%d", q[i]);
return 0;
}
运行结果:
输入:
6
5 6 3 3 4 9
输出:
334569