//或: mid=left+((right-left)/2);
//或: mid=(left&right)+(left^rigrt)>>1)
<span style="font-size:18px;">#include<iostream>
using namespace std;
#include<assert.h>
int BinarySearch(int *a, int size, int x)
{
assert(a);//一定不能为空,就用断言
int left = 0;
int right = size - 1;
int mid = 0;
while (left <= right)
{
mid = left + ((right - left) >> 1);
//或: mid=left+((right-left)/2);
//或: mid=(left&right)/*求相同位的和*/+(left^rigrt)/*求不同位的和*/>>1)
if (a[mid]>x)
{
right = mid - 1;//注意边界的控制
}
else if (a[mid] < x)
{
left = mid + 1;
}
else
return mid;
}
return -1;
}</span>
<span style="font-size:18px;">#include<iostream>
using namespace std;
#include<assert.h>
int BinarySearch(int *a, int size, int x)
{
assert(a);//一定不能为空,就用断言
int left = 0;
int right=size;
int mid = 0;
while(left<right)
{
mid = left + ((right - left) >> 1);
//或: mid=left+((right-left)/2);
//或: mid=(left&right)/*求相同位的和*/+(left^rigrt)/*求不同位的和*/>>1)
if (a[mid]>x)
{
right=mid;//注意边界的控制
}
else if (a[mid] < x)
{
left = mid + 1;
}
else
return mid;
}
return -1;
}</span>
总结:二分查找的关键是对边界的处理以及mid的定义,千万不能单纯的是mid=(left+right)/2;这样会造成不必要的麻烦,程序也会出错。