一、中心思想:分治
- 确定分界点 x : q[l] , q[r] , q[(l+r)/2] ,或者任取一点
- 调整区间,小于等于 x 的放在 x 左边,大于 x 的放在 x 右边
- 递归将左边和右边分别排好序
二、核心内容:调整区间
- 暴力做法:
- 另建两个数组 a[] , b[]
- 对 q[l] 到 q[r] 扫描,小于等于 x 的丢到 a ,大于 x 的丢到 b
- 先将 a 存进 q ,再接着存 b
虽然很不优雅,但是咱不差这内存,时间复杂度是一样的0.0
- 优雅的做法:
- 在 l 处和 r 处设置一个“指针” i , j
- 如果 i 处小于等于 x ,则 i 右移,直到 i 处大于 x 停下;然后判断 j 处,如果 j 处大于 x ,则 j 左移,直到 j 处小于等于 x 停下
- 终止条件: i=j
三、上代码!
void quick_sort(int q[], int l, int r)
{
if (l >= r)
return;
int x = q[(l + r) / 2], i = l - 1, j = r + 1; //这里将l-1,i+1的原因是下面采用的是do-while循环
while (i < j)
{
do
i++;
while (q[i] <= x); //采用do-while循环的原因是需要先移动再判断(判断完一次后下一次判断前需要先移动)
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); //对x左边和右边分别递归
}