二分查找Binary_Search

 

/*Binary_Search_int.cpp*/
#include<bits/stdc++.h>
using namespace std;

/*
1、建模:划分蓝红区域,确定IsBlue()
2、确定返回l还是r
3、套用算法模板
4、(后处理...)
*/

//模板
bool check(int mid){// 检查mid是否满足某种性质
    return true;
}

int BinarySearch(int n){
    int l = -1;
    int r = n;
    int mid;
    while(l+1 != r){
        mid = r + (l-r)/2;  //防int溢出
        if (check(mid))l = mid;    //根据实际情况设计函数
        else r = mid;
    }
    return l; //根据实际情况返回l或者r
}

/*例子*/
vector<int> arr = {1,2,3,5,5,5,8,9};

int BinarySearch01(int x){
    int l = -1, r = arr.size(),mid;
    while(l+1 != r){
        mid = r + (l-r)/2;
        if(arr[mid]<x) l = mid;
        else r = mid;
    }
    return l;
}

int BinarySearch02(int x){
    int l = -1, r = arr.size(),mid;
    while(l+1 != r){
        mid = r + (l-r)/2;
        if(arr[mid]<x) l = mid;
        else r = mid;
    }
    return r;
}

int BinarySearch03(int x){
    int l = -1, r = arr.size(),mid;
    while(l+1 != r){
        mid = r + (l-r)/2;
        if(arr[mid]<=x) l = mid;
        else r = mid;
    }
    return l;
}

int BinarySearch04(int x){
    int l = -1, r = arr.size(),mid;
    while(l+1 != r){
        mid = r + (l-r)/2;
        if(arr[mid]<=x) l = mid;
        else r = mid;
    }
    return r;
}

int main(){
    cout<<BinarySearch01(5)<<endl;//找到最后一个<5的元素      输出2
    cout<<BinarySearch02(5)<<endl;//找到第一个>=5的元素       输出3
    cout<<BinarySearch03(5)<<endl;//找到最后一个<=5的元素     输出5
    cout<<BinarySearch04(5)<<endl;//找到第一个>5的元素        输出6
    return 0;
}

 

/*Binary_Search_double.cpp*/
#include<bits/stdc++.h>
using namespace std;

bool check(double x){// 检查x是否满足某种性质
} 
double bsearch_double(double l, double r){
    const double eps = 1e-6;   // eps 表示精度,取决于题目对精度的要求(英文全称为epsilon,其来源为希腊字符ε的读音)
    while (r - l > eps){
        double mid = (l + r) / 2;
        if (check(mid)) r = mid;
        else l = mid;
    }
    return l;
}

int main(){

    return 0;
}

 

posted @ 2022-11-02 21:02  唔知叫咩emm  阅读(120)  评论(0编辑  收藏  举报