二分查找示例

import java.util.Arrays;

public class BinarySearch {

    private int[] values;

    public BinarySearch(int[] values) {
        if (values == null) throw new RuntimeException("values can not be null");
        this.values = Arrays.copyOf(values, values.length); // 拷贝一份数据
        Arrays.sort(this.values); // 正序排序
    }

    /**
     * 二分查找是否包含某个值
     * @param value 对应值
     * @return 如果包含返回索引,如果不包含返回-1
     */
    public int contain(int value) {
        if (values.length == 0) return -1;
        int lowerIndex = 0; // 最低位
        int upperIndex = values.length - 1; // 最高位
        int currentIndex;
        while (true) {
            currentIndex = (lowerIndex + upperIndex)/2; // 二分计算
            int currentVal = values[currentIndex]; // 获取当前值
            if (currentVal == value) { // 匹配到值直接返回
                return currentIndex;
            } else if (currentIndex == lowerIndex) { // 未匹配到值,且搜索项剩下2个的情况相等
                int upperVal = values[upperIndex];
                if (value == upperVal) { // 校验第二个值是否相等
                    return upperIndex;
                } else {
                    return -1;
                }
            } else {
                if (value < currentVal) { // 落在值较小的区域
                    upperIndex = currentIndex;
                } else { // 落在值较大的区域
                    lowerIndex = currentIndex;
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] vals = new int[]{2,4,5}; // 排序以后 [2,4,5]
        System.out.println(new BinarySearch(vals).contain(5));
    }

    @Override
    public String toString() {
        return "BinarySearch{" +
                "values=" + Arrays.toString(values) +
                '}';
    }
}

 

posted @ 2019-04-28 10:12  __lay  阅读(159)  评论(0编辑  收藏  举报