Section 1.快速排序

一、中心思想:分治

  1. 确定分界点x:q[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左边和右边分别递归
}

四、配套练习

AcWing785https://www.acwing.com/activity/content/problem/content/819/AcWing786https://www.acwing.com/activity/content/problem/content/820/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值