今天天气还算不错,考研一志愿浙江大学计算机失败了,最后调剂到了本校,虽然没能去到硕士的dream school,但是回到母校也能接受吧。收拾好心情也开始硕士三年的规划了,重新开始捡算法了。今天复习快速排序,归并排序
快速排序和归并排序都是基于分治思想的题目,分治的基本步骤就是
- 将原问题划分为若干个规模小的与原问题结构相同的子问题
- 递归解决子问题
- 将子问题的解合并为原问题的解
快速排序要注意的就是选好基准值pivot,为了避免超时,我们一般选择的是中间向上取整或者向下取整的值,这将导致后续递归解决子问题的时候,递归的边界。我个人习惯选择left+right+1>>1作为基准值,所以递归解决子问题的边界就是left到i-1和i到right。
归并排序还是比较好理解的,标准的分治思想解决题目,归并排序可以用来解决求逆序数对的问题,注意点就是逆序对个数的数量级为n的平方,所以数量级可能会超过10的9次方,因此要选用longlong型来存储,longlong型输出时候的格式控制字符串为%lld。
二分查找是经常使用的一种查找算法,包括整数二分和浮点数二分,浮点数二分的例题是求数的三次方根,浮点数二分每次划分不需要注意mid,left,right的取值,只需要注意double型变量的输入控制格式字符串为%lf,如果输出有小数位数要求的话,输出控制格式字符串为%.mf。
重点要说一下整数二分,整数二分查找的是满足某个性质的边界上的点。整数二分每次更新right和mid的时候,如果right=mid,则mid不需要加+1,如果是left=mid,则mid需要加+1,具体情况可以通过举两个数的例子看一下。
今天还注意到了一个点就是算术运算符的优先级要大于关系运算符大于赋值运算符。