二分法能在O(nlogn)的时间复杂度内在一堆有序排列的数内找到一个点,假设这这堆数被放在一个数组里
,不同的题意二分是可以变的,总结三种:
1.在有序数组a[100]里查找一个数p,说明这堆数里存在这个数p,所以就是一个正常的查找过程,代码如下(这里从第一项开始):
int E_F(int p,int *a)
{
int Left=1,Right=100,mid;
while(Left<=Right)
{
mid=(Right+Left)/2;
if(a[mid]==p)
return mid;
else if(a[mid]<p)
Left=mid+1;
else
Right=mid-1;
}
return Left;
}
2.有序数组找一个刚好与p接近并且大于p的数:
int E_F(int p,int *a)
{
int Left=1,Right=100,mid;
while(Left<Right)
{
mid=(Right+Left+1)/2;
if(a[mid]==p)
return mid;
else if(a[mid]<p)
Left=mid+1;
else
Right=mid;
}
return Left;
}
3.有序数组找一个刚好与p接近并且小于p的数:
int E_F(int p,int *a)
{
int Left=1,Right=100,mid;
while(Left<Right)
{
mid=(Right+Left+1)/2;
if(a[mid]==p)
return mid;
else if(a[mid]<p)
Left=mid;
else
Right=mid-1;
}
return Left;
}
这是三种模板,并且其中的循环条件即(Left<Right)里的是否加上等于号,可以手动模拟一下在去判断是否加等号。这里不再解释。