1.问题
在一个有序数组中如何找到一个数?
2.代码
#include <stdio.h>
int binarySearch(int arr[],int sz,int n)
{
int left = 0;
int right = sz-1;
int mid = 0;
while(left <= right)
{
mid = (left+right)/2;
if(arr[mid]>n)
right = mid-1;
else if(arr[mid]<n)
left = mid+1;
else
return mid;
}
return -1;
}
int main()
{
int arr[] = {1,2,5,7,9,11,15,16,18};
int n = 0;
int sz = sizeof(arr);
scanf("%d",&n);
int sub = binarySearch(arr,sz,n);
printf("%d\n",sub);
return 0;
}
3.上述代码要注意一点,就是在更新左右下标,即要将mid赋值给right,或将mid赋值给left时,right要减1,left要加1,原因如下:
1)arr[mid]已经和n进行了比较,不需要再次比较了
2)防止在某些时候,left和right的值相差为1,在求平均时,mid会等于left,造成无法缩小范围,即不会出现left>right的情况,形成死循环。