核心思想为分治
主体步骤:
1:确定分界点
2:以分界点为准将数组划分为高低两组(调整区间)
3:递归执行以上两步
(来源:AcWing 785. 快速排序 - AcWing)
1:确定分界点a[n]
分界点取法多样,通常取 a[ l ] , a[ r ] , a[(l+r)/2] , a[随机],取得a[n]作为分治的分界点。
2:划分两组(调整区间)
分别扫描a[n]两端数组,以a[n]为分界点,使得左区间<=a[n],右区间>=a[n](左端数组有大于a[n]的就放到右端,右端相反)。
3:递归
分别递归处理两区间(左端右端再次分治)。
代码实现
#include<iostream>
#include<cstdio>
using namespace std;
int a[100010];
void qsort(int l,int r)
{
if(l>=r)
return;
int i=l-1,j=r+1,x=a[(l+r)/2]; //确定分界点a[x](这里取中间值)
while(i<j)
{ //扫描左右两段
while(a[++i]<x); //(这里用双指针 i j 优化)
while(a[--j]>x);
if(i<j)
swap(a[i],a[j]);
}
qsort(l,j); //向下递归左段
qsort(j+1,r); //递归右段
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
qsort(1,n);
for(int i=1;i<=n;i++) printf("%d ",a[i]);
}