复习-基础课-基础算法

发布时间 2023-07-16 15:57:33作者: Moyyer_suiy

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.离散化

9.区间合并