设两个变量left和right分别表示被查找表的左边界和右边界,初始化时,left=0,right=n-1。令middle=(left+right)/2为list的中间位置。如果将list[middle]与需要查找的数searchnum做比较,则会出现下列3种情况。
- searchnum < list[middle]。把查找右边界right设置为middle - 1。
- searchnum = list[middle]。返回middle
- searchnum > list[middle]。把查找左边界left设置为middle + 1。
迭代:
#define COMPARE(x,y) (((x) < (y))? -1: ((x) == (y)) ? 0 : 1)
int binsearch(int list[], int searchnum, int left, int right)
{
int middle;
while(left <= right)
{
middle = (left + right) / 2;
switch(COMPARE(list[middle],searchnum))
{
case -1:
left = middle + 1;
break;
case 0:
return middle;
case 1:
right = middle - 1;
break;
}
}
}
递归:
#define COMPARE(x,y) (((x) < (y))? -1: ((x) == (y)) ? 0 : 1)
int binsearch(int list[], int searchnum, int left, int right)
{
int middle;
if(left <= right)
{
middle = (left + right) / 2;
switch(COMPARE(list[middle],searchnum))
{
case -1:
return binsearch(list, searchnum, middle + 1, right)
case 0:
return middle;
case 1:
return binsearch(list, searchnum, left, middle - 1)
}
}
return -1;
}