复习-基础课-基础算法
1.快速排序:不稳定,其他略。
2.归并排序:稳定,常用于求逆序对。
void msort(int l, int r)
{
if(l >= r) return;
int mid = (l + r) >> 1;
msort(l, mid);
msort(mid + 1, r);//递归排序
int k = 0;
int i = l, j = mid + 1;
while(i <= mid && j <= r)
{
if(a[i] <= a[j]) b[++ k] = a[i ++];//体现出来为何稳定了
else b[++ k] = a[j ++];
}
while(i <= mid) b[++ k] = a[i ++];//把剩余的部分加进去
while(j <= r) b[++ k] = a[j ++];
for(int i = l; i <= r; i ++ ) a[i] = b[i - l + 1];//最后转移到原数组,完成排序
}
3.二分:题目要求具有单调性,一般喜欢结合贪心考,即使没有单调性也能蒙分,代码略。
4.高精度:个人认为无意义,略,有空可能补一下。
5.差分与前缀和:针对具体题目巧妙应用,注意二维,高维还不会(也不太常用),其他略。
6.双指针:这是将 O(N^2) 优化到 O(n) 的强大算法。应用例:归并排序、kmp。
7.位运算:特点:快。能做很多事情,比如找规律(?),可以根据具体题目特性构造在二进制下答案。
求 lowbit,即求一个数二进制下最低位 1 的位置。在树状数组里会经常用。常见写法:lowbit(x) = x & (-x)。
位运算一定要加好括号,这个优先级比较玄学。不然哪一天自己怎么死的都不知道。
8.离散化:我喜欢用 map 离散化,略。
9.区间合并:略。