二分的几种方法

本文详细介绍了二分查找的64种不同实现方法,包括取整方式、区间开闭及针对不同序列的问题类型。通过具体的代码示例,帮助读者深入理解每种情况下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个分类方法我是从知乎是哪个面看到的,这里给大家普及一下:

64种。
对其进行分类:

取整方式:

向下取整 向上取整 (共2种)

**区间开闭:

**
闭区间 左闭右开区间 左开右闭区间 开区间 (共4种)

问题类型:

**对于不下降序列a,求最小的i,使得a[i] = key
对于不下降序列a,求最大的i,使得a[i] = key
对于不下降序列a,求最小的i,使得a[i] > key
对于不下降序列a,求最大的i,使得a[i] < key
对于不上升序列a,求最小的i,使得a[i] = key
对于不上升序列a,求最大的i,使得a[i] = key
对于不上升序列a,求最小的i,使得a[i] < key
对于不上升序列a,求最大的i,使得a[i] > key**
(共8种)综上所述,二分查找共有 2 * 4 * 8 = 64 种写法。


对于不下降序列的,四种分类写出代码如下:

//   a2 >= a1,    min  i   a[i] = key;
int binary_search_1(int a[], int n, int key)
{
    int mid;
    int s = 0;
    int e = n - 1;
    while(s < e)
    {
        mid = s + (e - s) >> 1;// 向下取整
        if(key <= a[mid])
            e = mid;
        else
            s = mid + 1;
    }
    if(a[e] == key) return e;
    return -1;
}

// a2 >= a1, max i , a[i] = key
int binary_search_2(int a[], int n, int key)
{
    int mid;
    int s = 0;
    int e = n - 1;
    while(s < e)
    {
        mid = s + (e - s + 1) >> 1;// 向上取整
        if(key >= a[mid])
            s = mid;
        else
            e = mid - 1;
    }
    if(a[s] == key) return s;
    return -1;
}

//a2 >= a1, min i, a[i] > key
int binary_search_3(int a[], int n, int key)
{
    int mid;
    int s = 0;
    int e = n - 1;
    while(s < e)
    {
        mid = s + (e - s) >> 1;//向下取整
        if(key < a[mid])
            e = mid;
        else
            s = mid + 1;
    }
    if(a[e] > key) return e;
    return -1;
}

// a2 >= a1, max i, a[i] < key
int binary_search_4(int a[], int n, int key)
{
    int mid;
    int s = 0;
    int e = n - 1;
    while(s < e)
    {
        mid = s + (r - s + 1) >> 1;//向上取整
        if(key > a[mid])
            s = mid;
        else
            e = mid - 1;
    }
    if(a[s] < key) return s;
    return -1;
}

了解跟多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值