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