class ChaZhao
{
/*--------------------------------------------------
功能: 非递归二分查找
参数说明
a[]: 要查找的目标数组
arrlen: 数组的长度
key: 查找的关键字
返回值: 查找成功返回关键字所在的下标,否则返回-1
特别说明: 无
----------------------------------------------------*/
static int no_loop_binary_Search(int a[], int arrlen,int key)
{
//在有序表R[0..n-1]中进行二分查找,成功时返回结点的位置,失败时返回-1
int low=0,high=arrlen-1,mid; //置当前查找区间上、下界的初值
while(low<=high)
{
if(a[low]==key)
return low;
if(a[high]==key)
return high;
//当前查找区间R[low..high]非空
mid=low+((high-low)/2);
//使用(low+high)/2会有整数溢出的问题
//(问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,
//这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)不存在这个问题
if(a[mid]==key)
return mid;//查找成功返回
if(a[mid]>key)
high=mid-1;//继续在R[low..mid-1]中查找
else
low=mid+1;//继续在R[mid+1..high]中查找
}
return -1;//表示所查找区间内没有结果,查找失败
}
/*--------------------------------------------------
功能: 递归二分查找
参数说明
a[]: 要查找的目标数组
low: 数组查找范围的低下标
hight: 数组查找范围的高下标
key: 查找的关键字
返回值: 查找成功返回关键字所在的下标,否则返回-1
特别说明: 无
----------------------------------------------------*/
static int binary_search(int a[],int low,int high,int key)
{
int mid=low+(high-low)/2;
if(low > high)
return -1;
else
{
if(a[mid] == key)
return mid;
else if(a[mid] > key)
return binary_search(a,low,mid-1,key);
else
return binary_search(a,mid+1,high,key);
}
}
}
public class Test002 {
public static void main(String[] args)
{
/*要查找的数字为9*/
int iValue = 9;
/*此数组是要查找的对象*/
int sziNumber[]={2,8,9,33,60,70,88,99,100};
/*查找结果的默认值是没有找到*/
int iRet=-1;
//递归查找
iRet = ChaZhao.binary_search(sziNumber,0,sziNumber.length-1,iValue);
if(-1 == iRet)
System.out.printf("binary_search no search the value:%d\r\n",iValue);
else
System.out.printf("binary_search search the seat:%d\r\n",iRet);
//非递归查找
iRet = ChaZhao.no_loop_binary_Search(sziNumber,sziNumber.length,iValue);
if(-1 == iRet)
System.out.printf("no_loop_binary_Search no search the value:%d\r\n",iValue);
else
System.out.printf("no_loop_binary_Search search the seat:%d\r\n",iRet);
}
}