二分查找的模板有没有问题?能不能再简化?
注意:我说的二分查找不是简单的查找某个数,是类似于这样的:
在有序数组查找第一个>=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。