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,以此类推