三种二分

来源:互联网 发布:嵌入式linux驱动开发 编辑:程序博客网 时间:2024/04/30 06:23

二分法能在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)/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)里的是否加上等于号,可以手动模拟一下在去判断是否加等号。这里不再解释。






0 0