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日
  • 展开全部

悬赏问题

  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败
  • ¥15 Centos7 / PETGEM
  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用