voidquick_sort(int q[],int l,int r){ if (l >= r) return;// 递归终止,注意:不能写成l == r int i = l - 1,j = r + 1,x = q[l+r>>1];// 注意两指针都取到边界之外 while (i < j){ do i ++;while (q[i] < x); do j --;while (q[j] > x); // 不用do-while等价的做法 // while (q[++ i] < x);while (q[--j] > x); if (i < j) swap(q[i],q[j]); } // while循环结束后,q[l..j] <= x,q[j+1..r] >= x quick_sort(q,l,j),quick_sort(q,j+1,r);// 注意:这个模板必须以j为划分点,不能取i }
intmain(){ scanf("%d",&n); for (int i = 0;i < n;i++) scanf("%d",&q[i]); quick_sort(q,0,n-1); for (int i = 0;i < n;i++) printf("%d ",q[i]); return0; }
voidquick_sort(int q[],int l,int r){ if (l >= r) return;// 递归终止 int i = l - 1,j = r + 1,x = q[l+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]); } // while循环结束后,q[l..j] <= x,q[j+1..r] >= x quick_sort(q,l,j),quick_sort(q,j+1,r);// 注意:这个模板必须以j为划分点,不能取i // 如果要以i为划分点划分子问题,参考上面的正确性证明,递归划分为[l,i-1]和[i,r] // 分界点x取q[l+r+1>>1] }