Java算法 -- 二分查找

折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。

通过递归和非递归实现二分查找:

public class Main {


    public static void main(String[] args) {
        int[] array = {1, 2, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59};
        int position = biSearch(array, 5);
        int position1 = biSearch(array, 1, array.length - 1, 5);
        System.out.println(position);
        System.out.println(position1);
    }

    /**
     * 非递归实现二分查找
     *
     * @param array
     * @param array
     * @return
     */
    public static int biSearch(int array[], int key) {
        int low = 0;
        //总长度
        int high = array.length - 1;
        while (low <= high) {
            //中间位置
            int mid = low + (high - low) / 2;
            //如果中间位置的值大于要查找的内容,从左侧查找
            if (array[mid] > key)
                high = mid - 1;
            else if (array[mid] < key)
                //如果中间位置的值小于要查找的内容,从右侧查找
                low = mid + 1;
            else
                //等于就返回
                return mid;
        }
        return -1;
    }


    /**
     * 递归实现二分查找
     *
     * @param array
     * @param low 从哪个位置开始
     * @param high 到哪个位置结束
     * @param target 要查询的值
     * @return
     */
    public static int biSearch(int array[], int low, int high, int target) {
        if (low > high) return -1;
        //中间位置
        int mid = low + (high - low) / 2;
        //中间位置的值大于要查询的内容,从左侧递归查询
        if (array[mid] > target)
            return biSearch(array, low, mid - 1, target);
        if (array[mid] < target)
            //中间位置的值小于要查询的内容,从右侧递归查询
            return biSearch(array, mid + 1, high, target);
        return mid;
    }

}

posted @ 2019-04-15 17:09  西北野狼  阅读(143)  评论(0编辑  收藏  举报