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

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

注意:我说的二分查找不是简单的查找某个数,是类似于这样的:
在有序数组查找第一个>=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;
}

```


#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;
}

以下为精简版的二分查找代码模板和解释,望采纳

int binary_search(int* arr, int n, int x) {
    int left = 0;
    int right = n - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == x) {
            return mid;
        } else if (arr[mid] < x) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1;
}

代码中,arr是待查找的数组,n是数组的大小,x是要查找的数。如果找到了x,则返回x在数组中的索引;如果没有找到,则返回-1。