void quick_sort(int q[],int l,int r){
if(l>=r) return;
int i=l-1,j=r+1,x=q[(l+r)/2];
while(i<j){
do i++; while(q[i]<x);
do j--; while(q[j]>x);
if(i<j) swap(q[i],q[j]);
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
代码解释:
l和r分别为对数组q[]进行排序的起始位置。
当l>=r时,函数直接返回,不执行后面的内容。
因为后面部分先执行i++,j–才进行其他操作,所以初始值设为l-1和r+1。
x的值可以取为q[l]、q[r]、或者数组中的任意一值。此处取为q[(l+r)/2]能避免边界问题。
(例如此处如果取为q[r],后面的代码需要进行相应的变动才是正确的,否则会存在边界问题。)
当i<j时,使得q[i]左边的数小于x,q[j]右边的数大于x。i和j都到达不满足大小判断条件的位置时,在满足i<j的条件下a[i]、a[j]互相交换位置。
上述步骤已经将数组的左、右区间调整好,接着分别递归左、右两段区间直到整个数组有序。
注意点:
快速排序有很多种写法,但我们只要会熟练使用一种就好了!
该模板经过无数人在实际应用中的千锤百炼,我们严格按照这里的写法就不会出错!
解释的太好了