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

posted @ 2024-11-02 15:48  清澈的澈  阅读(2)  评论(0编辑  收藏  举报