顺序表 | 二分搜索

 1.二分查找某个元素

1)递归实现

int dichotomy_find(int * sqList,int a,int b,int value){
    if(a>b) return -1;
    int m=(a+b)/2;
    if(sqList[m]==value) return m;
    else if(sqList[m]>value)return dichotomy_find(sqList,a,m-1,value);
    else return dichotomy_find(sqList,m+1,b,value);
}

 2)非递归实现

int bisearch(int arr[],int n,int x){
    int low=0,high=n-1,mid;
    while(low<=high){
        mid=(low+high)/2;
        if(arr[mid]==x) break;
        else if(arr[mid]<x) low=mid+1;
        else high=mid-1;
    }
    if(arr[mid]!=x) return -1;
    return mid;
}

 2.二分查找范围元素

int get_left(int * sqList,int a,int b,int s){
    //find:sqList[l-1]<s , sqList[l]>=s
    int m=(a+b)/2;
    if(sqList[m]>=s){
        if(a==b)
            return m;
        else
            return get_left(sqList,a,m,s);
    }else{
        if(a==b)
            return m;
        else
            return get_left(sqList,m+1,b,s);
    }
}

int get_right(int * sqList,int a,int b,int t){
    //find:sqList[l-1]<s , sqList[l]>=s
    int m=(a+b)/2;
    if(sqList[m]<=t){
        if(a==b)
            return m;
        else
            return get_right(sqList,m+1,b,t);
    }else{
        if(a==b)
            return m;
        else
            return get_right(sqList,a,m,t);
    }
}

效果:

原文地址:https://www.cnblogs.com/TQCAI/p/8108818.html