二分查找函数
#include<stdio.h>
int binary_search(int arr[],int k,int sz)
{
int left = 0;
int right = sz - 1;
while(left<=right)
{
int mid = (right - left) + left / 2;
if(arr[mid]<k)
{
left = mid + 1;
}
else if(arr[mid]>k)
{
right = mid -1;
}
else if(arr[mid] == k)
{
return mid;
}
else
{
return -1;
}
}
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int k = 7;
int sz = sizeof(arr)/sizeof(arr[0]);
int ret = binary_search(arr,k,sz);
if(ret==-1)
printf("没有找到");
else
printf("找到了,下标是%d\n",ret);
return 0;
}
写出有序数组
int arr[10]={1,2,3,4,5,6,7,8,9,10};
初始化
int k=7;
int ret=binary_search(arr,k,sz);
写函数
int binary_search(int arr[],int k,int sz)
{
int left = 0;
int rught = sz - 1;
while(left<=right)
{
int mid = left + (right-left) / 2;
if(arr[mid]<k)
{
left = mid + 1;
}
else if(arr[mid]>k)
{
right = mid - 1;
}
else if(arr[mid]=k)
{
return mid;
}
else
{
return -1;
}
}
}
主函数
int main()
{
if(ret==-1)
printf("找不到\n");
else
printf("找到了,下标是%d\n",ret);
return 0;
}
易错
设置mid参数注意位置,应放置在while循环内。
注意传递参数,k,arr,还有sz,由于arr数组给函数传参时传递的是数组的指针,所以在主函数求再传递至函数内时得到的是1或2(指针变量大小是4或8),所以sz应在函数内计算。