AC2656 2022-12-25 16:26 采纳率: 81.8%
浏览 57
已结题

二分查找的模板有没有问题?

二分查找的模板有没有问题?能不能再简化?

注意:我说的二分查找不是简单的查找某个数,是类似于这样的:
在有序数组查找第一个>=x或<=x的数,有数组元素升序、降序,和查找左边界、右边界这些因素,
在有序数组查找第一个>=x或<=x的数,有数组元素升序、降序,和查找左边界、右边界这些因素,
在有序数组查找第一个>=x或<=x的数,有数组元素升序、降序,和查找左边界、右边界这些因素,
重要的事情说3遍
以下是我写的二分查找模板:


```c
int find(int x, int l, int r) // 求第一个 >=x(记作①) 或 <= x(记作②) 的元素的下标
{  
    /*
    循环条件1// 区间内存在不同的元素
    循环条件2// 区间长度 >=3 (为了防止在区间长度为2的时候出现死循环)
    */
    while (a[l] != a[r] && r - l > 1) 
    {
        int mid = (l + r) / 2; 
        if (a[mid] == x)
            r = mid; // 左边界:r = mid; 右边界:l = mid;
        if (a[mid] > x)
            r = mid; // 升序:r = mid; 降序:l = mid;
        if (a[mid] < x)    
            l = mid + 1; // 升序:l = mid + 1; 降序:r = mid - 1;
    }
    
    //无解时返回 -1
    if (a[l] < x && a[r] < x) // ①:if条件里边用 < 号;   ②:if条件里边用 > 号;
        return -1;
        
    // 不满足条件时,缩小区间
    if (a[l] < x) // ①:if条件里边用 < 号;   ②:if条件里边用 > 号;
        l ++;
    if (a[r] < x)
        r --;
    
    // 返回最优解
    if (a[l] == a[r])
        return l; // 左边界:return l; 右边界:return r;
    if (a[l] < a[r]) // ①:if条件里边用 < 号;   ②:if条件里边用 > 号;
        return l;
    else                
        return r;
}

```

  • 写回答

3条回答 默认 最新

  • 流比 2022-12-25 16:45
    关注
    
    #include <stdio.h>
    
    // 二分查找
    int binary_search(int array[], int size, int key)
    {
        int low = 0;
        int high = size - 1;
    
        while (low <= high) {
            int mid = (low + high) / 2;
            if (key == array[mid]) {
                return mid;  // 找到了,返回下标
            } else if (key < array[mid]) {
                high = mid - 1;  // 继续查找左半部分
            } else {
                low = mid + 1;  // 继续查找右半部分
            }
        }
    
        return -1;  // 没有找到,返回-1
    }
    
    int main(void)
    {
        int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  // 要查找的数组
        int size = sizeof(array) / sizeof(int);  // 数组大小
        int key = 7;  // 要查找的数
    
        int index = binary_search(array, size, key);  // 二分查找
        if (index == -1) {
            printf("没有找到数字%d\n", key);
        } else {
            printf("找到数字%d,下标为:%d\n", key, index);
        }
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月31日
  • 已采纳回答 12月26日
  • 修改了问题 12月25日
  • 修改了问题 12月25日
  • 展开全部

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)