①确定分界点:q(l),q[(l+r)/2],q[r],随机取;
②调整区间:通过x划分为两段,第一个区间的值都小于等于x,第二个区间的值都大于等于x;
③递归处理左右两端,因为左边的最大值要小于右边的最小值;
调整区间的方法:
简单方法实现step1:开两个空间:a[],b[];
step2:扫描q[l-r]:将小于x的值放入a,将大于x的值放入b;
step3;将a和b的值放入原数组中;
经典方法实现step1:定义两个指针I,j,让i和j分别向中间走;
step2:i先往中间走,只要i指向的数x,那么i向后移动一位,直到i指向的数是大于等于x的,i就停下;移动j,同理,当遇到小于x的,j就停下;
step3:swap(I,j),i和j都往前移动一位。
实现模板publicstaticvoidquickSort(intq[],intl,intr){if(l=r)return;intx=q[l],i=l-1,j=r+1;while(ij){do{i++;}while(qx);do{j--;}while(q[j]x);if(ij){inttemp=q;q=q[j];q[j]=temp;}}quickSort(q,l,j);quickSort(q,j+1,r);}
「注意:」
如果要改为从大到小,把qx改为qx,q[j]x改为q[j]x即可;当递归的界限取j时,分界点不能取最右边的r,会有界限问题。默写时最好按照l,j这样进行默写。题目链接: