acautomaton
acautomaton
发布于 2022-01-09 / 24 阅读
0
0

Section 1.快速排序

一、中心思想:分治

  1. 确定分界点 xq[l]q[r]q[(l+r)/2] ,或者任取一点
  2. 调整区间,小于等于 x 的放在 x 左边,大于 x 的放在 x 右边
  3. 递归将左边和右边分别排好序

二、核心内容:调整区间

  • 暴力做法:
  1. 另建两个数组 a[]b[]
  2. q[l]q[r] 扫描,小于等于 x 的丢到 a ,大于 x 的丢到 b
  3. 先将 a 存进 q ,再接着存 b

虽然很不优雅,但是咱不差这内存,时间复杂度是一样的0.0

  • 优雅的做法:
  1. l 处和 r 处设置一个“指针” i , j
  2. 如果 i 处小于等于 x ,则 i 右移,直到 i 处大于 x 停下;然后判断 j 处,如果 j 处大于 x ,则 j 左移,直到 j 处小于等于 x 停下
  3. 终止条件: 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左边和右边分别递归
}

四、配套练习

AcWing785

AcWing786


评论