要求:在一个有序的数组中,查找是否有对应的元素。
思想:每次将中间元素与对应的数进行比较,进行判断,若相等跳出循环,若查找完毕无对应元素,返回-1值。提到二分,我们就会立即想到就会存在精度问题。
*关键点:
1.每次用中间元素mid对应的值进行比较,那么,我们必须保证mid可以访问到每一个元素。
举例:若left=3;right=4;mid=3;若此时设计的程序没有mid给left,right进行赋值进行+1或-1修正,则mid永远访问不到最后一个元素。
2.二分我们也可以保证精度不损失,只要我们能够知道l类似(3+4)/2=3二分之后朝较小的值取。所以说:给right用mid进行复制时,可以为right=mid,也可以right=mid-1;因为如果mid对应的值小于data,left=mid+1,(left永远小于right,否则就会跳出循环,也就是说mid只会可能给left大,不会比left小,极端情况下就是left=right=mid)会进行修正。二分之后的mid照样可以访问到最后一个元素。
#include<stdio.h>
#include<windows.h>
int BinarySearch(int array[], int n, int v);
int main()
{
int arr[] = { 1, 2, 3, 4,5,6};
printf("%d\n", BinarySearch(arr, sizeof(arr) / sizeof(arr[0]),3));
getchar();
return 0;
}
int BinarySearch(int array[], int n, int v)
{
int left, right, middle;
left = 0, right = n;
while (left <= right) //循环条件必须可以满足left<=right
{
middle = (left + right) / 2;
if (array[middle] > v)
{
right = middle;
}
else if (array[middle] < v)
{
left = middle+1;
}
else
{
return middle;
}
}
return -1;
}