这篇笔记写了一个半小时。 麻了。
代码如下
#include <stdio.h>
int binary_search(int arr[],int k)
{
//算法的实现--二分查找 找中间元素
int sz = sizeof(arr)/sizeof(arr[0]);
// printf("%d",sz);
int left =0;
int right = sz-1;
while(left<=right)
{
int mid = (left+right)/2;
if(arr[mid]<k)
{
left = mid+1;
}
else if (arr[mid]>k)
{
right = mid-1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9};
int sz = sizeof(arr)/sizeof(arr[0]);
// printf("%d",sz);
int k = 8;
//查找一个数字 找到返回下标 找不到返回-1
int ret = binary_search(arr,k);
if(ret==-1)
{
printf("找不到指定的数字");
}
else
{
printf("找到了,下标是:%d\n",ret);
}
return 0;
}
思想都在笔记里:我在这里讲讲遇到的几个坑吧。
int binary_search(int arr[],int k)//定义函数
{
//算法的实现--二分查找 找中间元素
int sz = sizeof(arr)/sizeof(arr[0]);
.........
int ret = binary_search(arr,k);.....//函数调用
注意!!!!!!!!
形参是实参的一份零时拷贝。
这里的函数调用传递的arr,因为是数组,实际上这里传递的是指针地址(首元素的地址),而不是值。,
而主函数外,int arr[]实际上是一个指针,指针接收地址,不要看它人模狗样是个数组,实际是个指针。当执行到这里时就会出错, int sz = sizeof(arr)/sizeof(arr[0]);
解决办法
在主函数内部就计算出这个值再传递。
int sz = sizeof(arr)/sizeof(arr[0]);
// printf("%d",sz);
int k = 8;
//查找一个数字 找到返回下标 找不到返回-1
int ret = binary_search(arr,k,sz); //函数外不要忘记接收
还有一点需要注意
int mid = (left+right)/2; 一定要写在循坏内,因为他的mid一直在变化。