代码呈现:
void quick_sort1(int q[],int l,int r){
if(l>=r)
return;
int x=q[l+r>>1], 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]);
}
quick_sort1(q,l,j);
quick_sort1(q,j+1,r);
}
思想:
分治+递归:1.确定一个分界点x,可以取q[l] ,q[r] ,q[(l+r)/2],随机值.
(取决于后面按i还是j划分,如果是按i划分就不能取q[l],如果是按j划分就不能取q[r],所以还是取随机值最好。具体原因是因为边界的细节问题,可以举例试试,有可能会陷入无限循环,比如最大数在右边按j划分取q[r])
2.用指针i,j调整数组元素位置,使得 q[l] 到 q[j]的数组范围中的数都小于等于x,而q[i]到q[r]的数组范围的数都大于等于x。
(调整方法大致为,先定义i=l-1,j=r+1,之所以不直接定义为l和r是因为后面我用的是do-while,会先进行一次自加和自减,然后i和j相向而行直到它们都遇见一个不满足区间要求的数后停下来,进入if语句中交换这两个数,以此类推直到 i>=j,一般有奇数个数的数组最后 i=j,而偶数个数数组最后 i>j。因为偶数数组这种情况所以会出现按 j 划分还是按 i 划分,可以模拟一下这个过程会更清晰)
3.再次递归处理左右两段数直到不能再分,最后得到的数组就是有序的。
不清楚的地方一般模拟一下就十分明朗了