//或: 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;這樣會造成不必要的麻煩,程序也會出錯。