ACW--基礎語法1(快排,歸併,二分)

清澈的澈發表於2024-11-02

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

相關文章