对于边界问题
- x取p[l]时,递归以 J、J+1分割
- x取p[r]时,递归以 i-1、i分割
- 总结就是取值和递归左右都选,不能全取左和全取右
void quick_sort(int p[],int l,int r){
if(l>=r) return;
int x=p[l],i=l-1,j=r+1; //取左边界-1,右边界+1 来满足进入while循环后的i++,j--
while(i<j){
do i++; while(p[i]<x);
do j--; while(p[j]>x);
if(i<j)swap(p[i],p[j]);
}
//第一种选j为分割 因为当退出while(i<j)时 i==j 但是不知道此时p[i]是否小于等于分界值
quick_sort(p,l,j); //但是我们能保证j左边的值一定比p[i]小
quick_sort(p,j+1,r);
//第二种选j
//quick_sort(p,l.i-1);
//quick_sort(p,i,r);
}