zoukankan      html  css  js  c++  java
  • 二分查找示例

    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) +
                    '}';
        }
    }
  • 相关阅读:
    函数表达式
    BOM
    让超出容器高度的内容滚动显示但不出现滚动条
    插件书写示例
    php中redis的安装
    日常工作bug总结
    pip freeze requirements.txt命令迁移模块
    Django18-中间件和cache实现限制用户访问频率
    Django17-文件上传下载
    Django16-cache缓存
  • 原文地址:https://www.cnblogs.com/lay2017/p/10782371.html
Copyright © 2011-2022 走看看