问题描述:给定数组a[0 : 8]={1, 8, 12, 15, 16, 21, 30, 35, 39}。采用二分搜索算法完成下述任务:当待搜索元素x=10不在数组中时,返回小于 x 的最大元素位置 i 和大于 x 的最小元素位置 j 。

变量定义:左指针lo,右指针hi,中间指针mid

解决方案:找不到x可以分两种情况讨论:
<1>lo的位置在hi的右边,即lo>hi,那么这时hi的位置就是小于 x 的最大元素位置 i ,而lo的位置就是大于 x 的最小元素位置 j
<2>lo与hi位置相同,那么这个元素如果比x大,那i的位置在这个位置的前一个,如果这个元素比x小,那么j的位置在他的后一个。

package search;

public class BinarySearch {

    public static int binary(int[] a,int lo,int hi,int n) {
        int i=0,j=0;         //小于n的最大元素位置i,大于n的最小元素位置j
        while(lo<hi) {
            int mid=(lo+hi)/2; //当lo>hi时,循环跳出,这时lo指针的位置就是大于n的最小元素位置j,hi指针     
            if(a[mid]<n) {lo=mid+1; j=lo;}  //的位置即小于n的最大元素位置
            else if(a[mid]>n) {hi=mid-1; i=hi;}
            else
                return mid;
        }
        if(lo==hi) {    //如果lo和hi指针指向同一个元素就会存在以下两种情况     
            if(a[lo]>n) i=j-1;  //如果指向的这个元素大于n说明它的前一个元素即小于n的最大元素
            else if(a[lo]<n) j=i+1;  //如果指向的这个元素小于n说明它的后一个元素即大于n的最小元素
        }
        System.out.print(i+","+j);
        return -1;
    }



    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int[] a= {1, 8, 12, 15, 16, 21, 30, 35, 39};
        int hi=a.length-1;
        binary(a,0,hi,10);
    }

}