三个步骤
快速排序主要包括三个步骤:确定分界点、调整区间、递归处理左右两边。
确定分界点
可以使用左边界(q[l]),中间值(q[(l+r)/2]),有边界(q[r]),随机
调整区间(最难的部分,要注意边界问题)
把整个区间一分为二,左半边<=x,右半边
-
暴力的方法
新开辟两个数组空间,遍历数组,分别将满足这两个条件的数值分别存储到两个数组 -
双指针方法
利用双指针分别从数组首尾往数组中间进行移动,满足左指针指向内容<=x,且右指针指向内容>=x时交换两个指针指向的内容,直到两个指针相遇
递归处理左右两边
递归对左右两边进行快速排序
代码模板
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int p[N], n;
void quick_sort(int p[], int l, int r)
{
if (l >= r) return;
int x = p[(l + r + 1) / 2], i = l - 1, j = r + 1;
while (i < j)
{
do i++; while (p[i] < x);
do j--; while (p[j] > x);
if (i < j) swap(p[i], p[j]);
}
quick_sort(p, l, i - 1);
quick_sort(p, i, r);
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &p[i]);
quick_sort(p, 0, n - 1);
for (int i = 0; i < n; i++) printf("%d ", p[i]);
}