二分查找

二分查找的本质是可以在有序的数列中,通过二分一个中间值进行探测,可以一次排除掉一半的数据,最后要么找到需要的数据,要么排除掉所有的数据。时间复杂度只有logN

bool binarySearch(int l, int r, int []arr, int value) {
    while(l<=r) {
     int mid = (l + r) / 2;
        if (arr[mid] < value) l = mid + 1;
        else if (arr[mid] > value) r = mid - 1;
        else return true;      
    }  
    // 没有找到
    return false;
}  
View Code

还有一种情况,比如说需要寻找在数列中不大于value的最大值,可以在上面二分的基础上增加一个index记录边界值,代码入下:

int binarySearch(int l, int r, int []arr, int value) {
    int index = -1;
    while(l<=r) {
     int mid = (l + r) / 2;
        if (arr[mid] <= value) l = mid + 1, index = mid;
        else if (arr[mid] > value) r = mid - 1;   
    }  
    return index;
}  

 经过不断排除和试探,最后mid肯定会取到边界值上面去

posted @ 2021-07-19 15:33  hzhuan  阅读(86)  评论(0编辑  收藏  举报