java 二分查找

来源:互联网 发布:英语选择题答案软件 编辑:程序博客网 时间:2024/05/22 01:50

二分查找又称折半查找,是一种较高效率的查找方法。

优点:比较次数少,查找速度快,平均性能好,占用系统内存较少。

缺点:要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

算法要求:

1.必须采用顺序存储结构。

2.必须按关键字大小有序排列。

算法思想:
将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x小于a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x大于a[n/2],则我们只要在数组a的右 半部继续搜索x

算法实现

方式一:while循环

public int binarySearch(Integer[] srcArray, int element) {        //定义初始最大、最小索引        int start = 0;        int end = srcArray.length - 1;        //确保不会越界重复查找        while (start <= end && start <= srcArray.length - 1 && end <= srcArray.length - 1) {            //获取中间索引,若写为:middle=(start+end)/2,则会出现在当start+end的结果大于表达式结果类型所能表示的最大值时,            // 这样产生溢出后再 / 2 是不会产生正确结果的,            int middle = start + (end - start) / 2;            if (element == srcArray[middle]) {                return middle;                //判断下限            } else if (element < srcArray[middle]) {                end = middle - 1;                //判断上限            } else {                start = middle + 1;            }        }        //若没有查找到则返回-1        return -1;    }

方式二:递归

    public int binarySearch(Integer[] srcArray, int start, int end, int element) {        //获取中间索引,若写为:middle=(start+end)/2,则会出现在当start+end的结果大于表达式结果类型所能表示的最大值时,        // 这样产生溢出后再 / 2 是不会产生正确结果的,        int middle = start + (end - start) / 2;        if (element == srcArray[middle]) {            return middle;        } else if (start > end) {            return -1;            //判断下限        } else if (element < srcArray[middle]) {            end = middle - 1;            return binarySearch(srcArray, start, end, element);            //判断上限        } else {            start = middle + 1;            return binarySearch(srcArray, start, end, element);        }    }
原创粉丝点击