课上:理解主要思想;
课后:背过,针对题目进行模板默写;
熟练度练习:AC之后,删除然后重写,重复3~5次。
快速排序算法模板:
步骤:1.随便找一个x; 2.二分数组,使得左边的的小于x,右边的大于x。3. 递归。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18void quick_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]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
作者:yxc
链接:https://www.acwing.com/blog/content/277/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
786. 第k个数:快速选择算法
https://www.acwing.com/problem/content/description/788/
给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少
思路:使用快排,但是我们只找第k个数,所以选择划分点k,根据k划分左右两边,判断左边得长度left<=k,那么递归计算左边便可,否则k在右边,递归计算右边,同时k更新k为k减去左边得长度。
时间复杂度为$O(n)$。
1 |
|
https://www.acwing.com/problem/content/787/
归并排序模板:
- (辅助数组)1. 找出中点位置; 2. 递归; 3. 归并—-合二为一;
1 | void merge_sort(int q[], int l, int r) |
788. 逆序对的数量
https://www.acwing.com/problem/content/790/
- 归并排序的时候,1、把数组切成两半;2、对左右两半做递归;3、利用辅助数组挨个放置左右部分的数字
在第三步的时候,就可以计算逆序对,特别当右部分的数放入时,与它可以构成的逆序对=左边部分的长度 - 放入的索引值。(都大于该放入值,且原本在该放入值的左边)
1 |
|
二分
整数二分算法模板:
1 | bool check(int x) {/* ... */} // 检查x是否满足某种性质 |
789. 数的范围
https://www.acwing.com/problem/content/791/
给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。
对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。
如果数组中不存在该元素,则返回“-1 -1”。
1
2 >1 2 2 3 3 4
1 |
|
790. 数的三次方根
https://www.acwing.com/problem/content/submission/code_detail/405694/
- 浮点数二分:要求保留小数后6位,那么计算的时候写r - l > 1e-8。判断时候低两位
1 |
|