排序与二分
学习算法的主要方法
背过代码模板
一个题目的代码写 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
复制代码
浮点数二分
不需要考虑上述的边界问题,直接二分
复制代码
评论