二分查找必须知道数组的左右下标, 通常情况下, 数组的左右下标表示如下:
int left = 0; int right = sizeof(arr) / sizeof(arr[0]) - 1;
若通过函数调用来实现二分查找, 就要进行传参. 需要将数组和所要寻找的值传递给二分查找所对应的函数
然而, 数组在传参的时候, 传过去的是一个数组名(arr), 本质上传过去的确是数组的首元素的地址 (&arr[0])
也就是说, 数组传参会发生降级 --- 变成首元素的地址, 那么函数就会使用一个指针来接收这个地址
这时, 若在函数内部求数组的左右下标的话, sizeof(arr) == 4(在32位系统下, 指针的大小为4个字节), 进而右下标就变成了0
所以, 不能再函数内部计算数组的右下标, 而应该在函数外部就计算好, 然后传参给函数.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int Binary_search(int arr[], int k, int sz) {
int left = 0;
int right = sz - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] > k) {
right = mid - 1;
} else if (arr[mid] < k) {
left = mid + 1;
} else {
return mid;
}
}
return -1;
}
int main() {
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int k = 0;
scanf("%d", &k);
int sz = sizeof(arr) / sizeof(arr[0]); // 数组的长度
int ret = Binary_search(arr, k, sz); // (传参的arr为数组首元素的地址) 若找到了就返回数组下标, 找不到就返回-1
if (ret == -1) {
printf("找不到\n");
} else {
printf("找到了, 下标是%d\n", ret);
}
return 0;
}
程序运行结果: