0
点赞
收藏
分享

微信扫一扫

二分查找概述

天行五煞 2022-02-13 阅读 52
算法

        我们最早接触到二分法可以追述到高中,有一类求方程近似解的问题,对于区间[a,b]上的连续不断且f(a)f(b)<0的函数y=f(x),通过不断地把它的零点所在区间一分为二,使得区间的两个端点逐步逼近零点,进而得到近似解的方法叫做二分法.二分法是求方程近似解的常用方法,这种方法由“区间”端点对应的数,研究“点”对应的具体的数:通过不断缩小“区间”,由“区间”左端点对应的单调递增数列,以及右端点对应的单调递减数列,不断逼近这一系列“区间”组成的区间套中的具体点对应的数.二分法的本质仍然是通过数的运算研究问题.

        如果高中学的不错的话,那么理解其来编程中的二分法应该很简单了,只要掌握如何用编程实现就行。二分有两种实现方式。一种是递归,一种是非递归。

非递归

public class BinarySearch {
    private int[] array;
    /**
     * 递归实现二分查找
     * @param target
     * @return
     */
    public int searchRecursion(int target) {
        if (array != null) {
            return searchRecursion(target, 0, array.length - 1);
        }
        return -1;
    }
    private int searchRecursion(int target, int start, int end) {
        if (start > end) {
            return -1;
        }
        int mid = start + (end - start) / 2;
        if (array[mid] == target) {
            return mid;
        } else if (target < array[mid]) {
            return searchRecursion(target, start, mid - 1);
        } else {
            return searchRecursion(target, mid + 1, end);
        }
    }
}

递归

public class BinarySearch {
    private int[] array;
    /**
     * 初始化数组
     * @param array
     */
    public BinarySearch(int[] array) {
        this.array = array;
    }
    /**
     * 二分查找
     * @param target
     * @return
     */
    public int search(int target) {
        if (array == null) {
            return -1;
        }
        int start = 0;
        int end = array.length - 1;
        while (start <= end) {
            int mid = start + (end - start) / 2;
            if (array[mid] == target) {
                return mid;
            } else if (target < array[mid]) {
                end = mid - 1;
            } else {
                start = mid + 1;
            }
        }
        return -1;
    }
}

        其中需要注意的就是是,边界点的变化。

举报

相关推荐

0 条评论