排序与二分
学习算法的主要方法
- 背过代码模板 
- 一个题目的代码写 3~5 遍 
快速排序——分治
- 确定分界点:q[l],q[(l+r)/2],q[r],随机选择一个点 
- 调整区间,将第一个区间内所有的数都小于等于 x,第二个区间内所有的数都大于等于 x。(中间数不一定是 x) 
- 递归处理左右两段 
 
 image.png
开始 i 指向的数≤x,j 指向的数≥x,一旦不成立 i 和 j 的数进行交换,直到 i 和 j 相遇
无论在什么时候 i 前面的数都是≤x,j 后面的所有数≥x
快排模板
复制代码
 归并排序——分治
- 确定分界点:mid=(l+r)/2 
- 递归排序 left,right 
- 归并——合二为一 
 
 image.png
 
 image.png
左右端比较循环扫描。
复制代码
 拓展
归并排序是稳定的,快速排序是不稳定的。
稳定:原序列两个数是相同的,排序之后两个数的位置不发生变化是稳定的,否则是不稳定的。
将快排中所有的数都变成不同的数时,快排就可以变为稳定的排序。
二分
重点:二分的本质并不是单调性,有单调性一定可以二分,二分不一定需要单调性。
整数二分
 
 image.png
满足在红色区域时
- mid=l+r+1>>1 
if(check(mid)) true [mid,r],l=mid
false [l,mid-1],r=mid-1
复制代码
 满足在绿色区域时
- mid=l+r>>1 
if(check(mid)) true [l,mid],r=mid
false [mid+1,r],l=mid+1
复制代码
 浮点数二分
不需要考虑上述的边界问题,直接二分
复制代码
 











 
    
评论