一、算法思路——分治
1.确定分界点x,x可以是任意一个数取边界q[l],q[r],以及q[l+r>>1]都可以
2.调整区间将大于x的数移到x的左边小于x的数移到右边
3.递归处理x左右两部分
二、代码模板及分析
1.递归结束
if(l>=r)return;
当左指针和右指针相遇时退出递归。
2. 左右指针
int i=l-1,j=r+1;
i,j各自往后移动一位,因为在调整区间时交换q[i],q[j]后i和j会前进一位,所以开始i,j退后一位确保能使最开始两个数能够交换。
3.调整区域
while(i<j){
do i++;while(q[i]<x);
do j--;while(q[j]>x);
if(i<j)swap(q[i],q[j]);
}
当i指到大于分解值x的时候停下,j指到小于分界值x的停下,交换q[i],q[j]的值继续迭代直至i和j相遇。
4.递归左右区间
quick_sort(l,j);
quick_sort(j+1,r);
将l~j左区间和j+1~l右区间进行相同分治