ACW--基础语法1(快排,归并,二分)
1.快排
2.归并
3.二分
通过与中间值mid比较,选择左边或是右边,就是二分
具有 单调性的一定可以使用二分法解决
没有单调性,有时候也可以用二分
3.1整数二分
划分思路:
-
整数二分有两个模板,一个是区间[l,r]被划分成
[l,mid]和[mid+1,r]
时使用的,还有一个是区间[l,r]被划分为[l,mid-1]和[mid,r]
时使用。 -
二分后的数组是否需要mid元素值
-
check(mid) == true时,取左边还是取右边
取左边
//区间[l,r]被划分成[l,mid]和[mid+1,r]时使用: int bsearch_1(int l,int r) { while(l < r) { int mid=(l+r)/2; // 如果是r = mid 则mid里不需要+1 if(check(mid)) r=mid; //check判断 mid 是否满足某种性质 else l=mid+1; } return l; //或return r ,因为循环结束后l=r }
取右边
//区间[l,r]被划分为[l,mid-1]和[mid,r]时使用: int bsearch_2(int l,int r) { while(l < r) { int mid=(l+r+1)/2; // 这里+1原因 // 如果是l = mid 则mid里需要+1 if(check(mid)) l=mid; else r=mid-1; } return l; //或return r ,因为循环结束后l=r }
int mid=(l+r+1)/2;
加一原因:
如果l = r- 1 此时mid = l
如果check(mid)为true,则l = mid 也就是 l = l
没有发生变化,程序运行无用,死循环
3.2浮点二分
与整数二分不同,浮点二分是对区间进行分割,理论上可以无限分割,根据题意来确定最终区间的大小(如:r-l < 10^-6)
模板
while(r - l > 1e-6){ mid = (l + r) / 2 if (check(mid)) r = mid; else l = mid; }
保留四位小数,对应e-6
五位,对应e-7,以此类推
本文作者:清澈的澈
本文链接:https://www.cnblogs.com/lmc7/p/18522016
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步