二分法查找的java简单实现

484 阅读1分钟

package com.example.demo;

import java.util.Arrays;

/**
 * 二分法查找
 */
public class BinarySearch {
    public static void main(String[] args) {
        int[] arr = {30, 20, 20, 50, 10, 80, 9, 7, 12, 100, 40, 8};
        //二分法查找需要是一个有序的数组
        Arrays.sort(arr);
        //  sort方法底层使用的的快速排序 DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
        System.out.println(Arrays.toString(arr));
        System.out.println(binarySearch(arr, 8));
        System.out.println(binarySearchByRecursion(arr, 0, arr.length - 1, 8));
    }

    /**
     * 二分法查找的非递归实现
     *
     * @param arr   需要查找的数组
     * @param value 查找的值
     * @return 返回value的index
     */
    private static int binarySearch(int[] arr, int value) {
        int low = 0;
        int high = arr.length - 1;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if (value == arr[mid]) {
                return mid;
            }
            if (value > arr[mid]) {
                low = mid + 1;
            }
            if (value < arr[mid]) {
                high = mid - 1;
            }
        }
        return -1;//没有找到返回-1
    }

    /**
     * 递归方法实现二分查找法.
     *
     * @param arr  数组
     * @param low  数组第一位置
     * @param high 最高
     * @param key  要查找的值.
     * @return 返回值.
     */
    private static int binarySearchByRecursion(int[] arr, int low, int high, int key) {
        if (low <= high) {
            int mid = (low + high) / 2;
            if (key == arr[mid])
                return mid;
            else if (key < arr[mid])
                //移动low和high
                return binarySearchByRecursion(arr, low, mid - 1, key);
            else if (key > arr[mid])
                return binarySearchByRecursion(arr, mid + 1, high, key);
        }
        return -1;
    }
}