java两种方式实现二分查找

java两种方式实现二分查找

1.while循环实现

2.递归实现

二分查找是什么?

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

代码演示

package com.ks.binarysearch;
/**
 * @author 柯神_
 * @date 2020-12-23 17:00:02
 * @Description 二分查找,又名折半查找
 */
public class BinarySearch {
    private final static int error = -1;

    public static void main(String[] args) {
        /**
         * 1.测试while循环
         */
        int[] a = {1, 2, 4, 9};
        System.out.println("===while循环实现=============");
        System.out.println("key:1,在数组中的位置" + bSearch(a, 1));
        System.out.println("key:2,在数组中的位置" + bSearch(a, 2));
        System.out.println("key:4,在数组中的位置" + bSearch(a, 4));
        System.out.println("key:9,在数组中的位置" + bSearch(a, 9));

        /**
         * 2.测试递归
         */
        System.out.println("===递归实现=============");
        System.out.println("key:1,在数组中的位置" + recursionSearch(a, 1, 0, a.length - 1));
        System.out.println("key:2,在数组中的位置" + recursionSearch(a, 2, 0, a.length - 1));
        System.out.println("key:4,在数组中的位置" + recursionSearch(a, 4, 0, a.length - 1));
        System.out.println("key:9,在数组中的位置" + recursionSearch(a, 9, 0, a.length - 1));
    }


    /**
     * 1.非递归方式
     */
    public static int bSearch(int[] arr, int key) {
        int low = 0;
        int hgt = arr.length - 1;
        int mid = 0;

        //优化查询条件
        if (key < arr[0] || key > arr[hgt]) {
            return error;
        }

        while (low <= hgt) {
            mid = (low + hgt) / 2;
            if (key < arr[mid]) {
                hgt = mid - 1;  //向左查找
            }
            if (key > arr[mid]) {
                low = mid + 1;  //向右查找
            }
            if (key == arr[mid]) {
                return mid;     //找到返回
            }
        }
        return error;           //找不到返回
    }


    /**
     * 2.递归
     */
    public static int recursionSearch(int[] arr, int key, int low, int hgt) {

        int mid = (low + hgt) / 2;

        //优化查询条件
        if (key < arr[low] || key > arr[hgt] || low > hgt) {
            return error;
        }

        if (key < arr[mid]) {
            return recursionSearch(arr, key, low, mid - 1);    //向左查找
        }
        if (key > arr[mid]) {
            return recursionSearch(arr, key, mid + 1, hgt);    //向右查找
        }
        if (key == arr[mid]) {
            return mid;                    //找到返回
        }
        return error;                      //找不到返回
    }
}

结果演示

原文地址:https://www.cnblogs.com/qqkkOvO/p/14180862.html