双调查找


首先找到数组的分割点然后按照二分查找即可。


数组的分割点也可以按照二分查找来,不过需要修改一下地方。


package sf1_4;



/**
 * Created by LoveQuietly on 2016/9/7.
 */
public class DoubleSearch {
    public static void main(String[] args) {
        int []a={1,5,6,7,9,23,12,9,7,5,3,2,1};
        getPosition(a,2);
    }

    /**
     * 用来查找数据分割点
     * @param a
     * @return
     */
    public static int getThePoint(int[] a) {
        int lo = 0;
        int high = a.length - 1;
        int mid = 0;
        //当lo==high的时候已经找到了位置
        while (lo < high) {
            //上划线
            mid = lo + (high - lo) / 2;
            //升序
            if (a[mid] < a[mid + 1]) {
                lo = mid + 1;
                //降序
            } else if (a[mid] < a[mid - 1]) {
                high = mid-1;
            }else
                return mid;
        }

        return lo;
    }

    //测试代码
    public static int getPosition(int[] a, int key) {
        int pos=getThePoint(a);
        int t=binaryUp(a,0,pos,key);
        System.out.println(t);
        if (t!=-1)
            return -1;
        int t1=binaryDown(a,pos+1,a.length-1,key);
        System.out.println(t1);
        return -1;
    }

    //降序的时候二分查找
    public static int binaryDown(int[] a, int lo, int high, int key) {
        int mid = 0;
        while (lo <= high) {
            mid = lo + (high - lo) / 2;
            if (a[mid] < key) {
                high = mid - 1;
            } else if (a[mid] == key) {
                return mid;
            } else {
                lo = mid + 1;
            }
        }
        return -1;
    }

    //升序的时候二分查找
    public static int binaryUp(int []a,int lo,int high,int key){
        int mid=0;
        while(lo<=high){
            mid=lo+(high-lo)/2;
            if(a[mid]==key)
                return mid;
            else if(a[mid]>key){
                high=mid-1;
            }else
                lo=mid+1;
        }
        return -1;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值