快速排序
算法思想
首先,此算法利用的是分治的思想。所以我们在处理递归每一层的时候,要满足一个性质,使这种性质在每一层递归满足本层的性质的时候都可以延续上一层的性质。
要满足的性质:
设置一个x值和一个分界点,在其前面的的数字必须满足小于等于x,在其后面的必须满足大于等于x。
算法的三个部分:
- 设置一个x分界值:可以是左边界、又边界、中位数(序列中间)、随机数
- 进行序列的调整,使其目前递归的的区间满足以上下性质。
- 递归
算法模板
AC代码
int q[N];
void q_s(int l,int r){
if(l>=r) return ;
int x=q[l+r>>1];
int 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]);
}
q_s(l,j);
q_s(j+1,r);
}
注意事项
递归时用i x不能去q[l]或q[l+r>>1]
用j 不能用q[r]或q[l+r+1>>1]
否则会导致算法一直递归同一个区间,导致MLE或者Segmentation fault。