说明
继二分查找之后,尝试使用函数的方式来实现二分查找的方式。
代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int binary_search(int arr[], int k, int sz)
{
int left = 0;
int right = sz;
while (left<=right)
{
int mid = left + (right - left) / 2;
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
return mid;
}
}
if (left > right)
{
return -1;
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k=1;
int sz = sizeof(arr) / sizeof(arr[0])-1;
int res = binary_search(arr, k, sz);
if (res < 0)
{
printf("找不到。\n");
}
else {
printf("找到了,下标是:%d", res);
}
return 0;
}
总结
以上代码中的sz是不能放在函数中实现的。
int sz = sizeof(arr) / sizeof(arr[0])-1;
不然会出现找不到。的情况
//错误示范 int binary_search(int arr[], int k, int sz) { int left = 0; int right = sz; int sz = sizeof(arr) / sizeof(arr[0])-1; }
这是因为数组在传参的时候,实际上传的是数组的首地址,是个指针变量,而不是整个数组。在调试的时候,计算的是arr的大小,在一除arr[0]就等于1或2,因此,数组的范围就变小了,就会得到错误答案。