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.区间合并
标签:题目,复习,int,mid,msort,算法,基础课,排序 From: https://www.cnblogs.com/Moyyer-suiy/p/17557966.html