快速排序

快速排序是分治的思想,步骤:

  1. 确定分界点,是随机选取的,也可以是q[l],q[(l/r)/2],q[r],主意规定的有可能会导致时间复杂度变为 $O(n)$
  2. 调整范围,确定分界点以后左边的数小于分界点,右边的数大于分界点
  3. 归并处理左右两端

优化算法,分别取两端ijij分别向中间靠拢,当出现ij,比较不符时,更换对应下标的值

void quick_sort(int q[], int l, int r)
{
if (l >= r)
return;
int x = q[rand() % (r - l + 1) + l], 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_sort(q, l, i - 1);
quick_sort(q, i, r);
}