1.循环写法while
public static int rank(int key,int nums[])
{
//查找范围的上下界
int low=0;
int high=nums.length-1;
//未查找到的返回值
int notFind=-1;
while(low<=high)
{
//二分中点=数组左边界+(右边界-左边界)/2 ( 即:(左边界+右边界)/2 )
//double强转整数类型,会直接舍弃小数只留整数。
int mid=low+(high-low)/2;
System.out.println("low:"+low+" high:"+high);
System.out.println("二分找中点:"+"mid="+low+"+("+high+"-"+low+")"+"/2="+mid+"\n");
//中间值是如果大于key
if(nums[mid]>key)
{
//证明key在[low,mid-1]这个区间
//因为num[mid]已经判断过了所以下界要减一
high=mid-1;
}else if(nums[mid]<key)
{
//证明key在[mid+1,high]这个区间
//同样判断过mid对应的值要从mid+1往后判断
low=mid+1;
}
else //即:( nums[mid]==key )
{
//查找成功
return mid;
}
}
//未成功
return notFind;
}
测试结果:
测试:
int nums[] = {0,1,2,3,4,5,6,7};
Test.rank(7, nums);
打印:
low:0 high:7
二分找中点:mid=0+(7-0)/2=3
low:4 high:7
二分找中点:mid=4+(7-4)/2=5
low:6 high:7
二分找中点:mid=6+(7-6)/2=6
low:7 high:7
二分找中点:mid=7+(7-7)/2=7
2.递归写法
public static int search1(int num, int low, int high, int a[]) {
int middle = (high + low) / 2;
while (low <= high) {
// 注意等号要有
if (a[middle] > num) {
return search1(num, low, middle - 1, a);
} else if (a[middle] < num) {
return search1(num, middle + 1, high, a);
}
else { //即:( nums[mid]==key )
return middle;
}
}
return -1;
}
测试:
int nums[] = {0,1,2,3,4,5,6,7};
Test.search(7,0,nums.length-1,nums);
转载自(我在原文基础上有增加补充):https://blog.csdn.net/dijiaxing1234/article/details/81178097