二分
引例:寻找伪币
给你一个装有16枚硬币的袋子。16枚硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。你需要是找出这枚伪造的硬币。
方法1
任意取1枚硬币,与其他硬币进行比较,若发现轻的,就是伪币。最多可能有15次比较。 如果伪币在最后,时间复杂度就会很高,不稳定。
方法2
将硬币分为8组,每组2个,每组比较一次,若发现轻的,则为伪币。最多可能有8次比较。时间复杂度还是很高。
方法3
第一次先把硬币分成两组,如果第一组轻一些,就说明伪币在第一组,第二组就没有,一次就可以将硬币的范围缩小到了原来的一半。
这就是 二分,时间复杂度最低,也很稳定。
二分的代码
在递增序列a中查找 ≥ \geq ≥x的数中最大的一个数
while(l<r)
//(l,r)就是要查找的区间
{
long long mid=(l+r)>>1;
//>>1就是/2的意思 ,mid就是区间的中间
if(a[mid]>=x)
{
r=mid;
}
//如果区间的中间都>了x,那自然前面的都<x,所以r=mid也就是舍去前面的数
else
{
l=mid+1;
}