五个二分搜索

来源:互联网 发布:join方法javascript 编辑:程序博客网 时间:2024/05/09 07:58

/*
1.找下标i使得X[i] = V
  返回 i或者-1
*/
int BinarySearch(const int* X,int N,int V)
{
    if(X==NULL) return -1;
    int L=0,U=N-1,M;
    while(L <= U)
    {
        M = L+((U-L)>>1);
        if(X[M] == V) return M;
        if(X[M] > V) U=M-1;
        else L=M+1;
    }
    return -1;
}
/*
二分搜索
2.找 |最小| 下标i使得X[i] = V
  返回 i 或者-1
*/
int BinarySearch_Min(const int* X,int N,int V)
{
    if(X==NULL) return -1;
    int L=0,U=N-1,M;
    while(L+1 < U)
    {
        M = L+((U-L)>>1);
        if(X[M] >= V) U = M;
        else L = M;
    }
    if(X[L] == V) return L;
    if(X[U] == V) return U;
    return -1;
}
/*
二分搜索
3.找 |最大| 下标i使得X[i] = V
  返回 i 或者-1
*/
int BinarySearch_Max(const int* X,int N,int V)
{
    if(X==NULL) return -1;
    int L=0,U=N-1,M;
    while(L+1 < U)
    {
        M = L+((U-L)>>1);
        if(X[M] <= V) L = M;
        else U = M;
    }
    if(X[U] == V) return U;
    if(X[L] == V) return L;
    return -1;
}
/*
二分搜索
4.找 |最大| 下标i使得X[i] < V
  返回 i 或者-1,(不存在)
*/
int BinarySearch_Less_Max(const int* X,int N,int V)
{
    if(X==NULL) return -1;
    int L=0,U=N-1,M;
    while(L+1 < U)
    {
        M = L+((U-L)>>1);
        if(X[M] >= V) U = M;
        else L = M;
    }
    if(X[L] < V) return L;
    return -1;
}
/*
二分搜索
5.找 |最小| 下标i使得X[i] > V
  返回 i 或者-1,(不存在)
*/
int BinarySearch_Greater_Min(const int* X,int N,int V)
{
    if(X==NULL) return -1;
    int L=0,U=N-1,M;
    while(L+1 < U)
    {
        M = L+((U-L)>>1);
        if(X[M] <= V) L = M;
        else U = M;
    }
    if(X[U] > V) return U;
    return -1;
}