Java實現二分查找

Java實現二分查找

二分查找針對的是一個有序的數據集合,查找思想有點相似分治思想。每次都經過跟區間的中間元素對比,將待查找的區間縮小爲以前的一半,直到找到要查找的元素,或者區間被縮小爲0。數組

這裏咱們實現最簡單狀況下的二分查找。升序排列的數組,無重複元素,查找其中是否包含單個元素。 非遞歸方式實現:bash

/**
     * 二分查找,針對不存在重複元素的。非遞歸實現。
     *
     * @param a     升序數組
     * @param n     數組大小
     * @param value 要查找的數值
     * @return 返回值表示要查找的數據在數組中的角標,若是沒有則返回-1.
     */
    public static int binarySearch1(int[] a, int n, int value) {
        int low = 0;
        int high = n - 1;

        while (low <= high) {
            int mid = low + ((high - low) >> 1);
            if (a[mid] == value) {
                return mid;
            } else if (a[mid] < value) {
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }

        return -1;
    }
複製代碼

固然,也能夠使用遞歸方式實現:ui

/**
     * 二分查找,針對不存在重複元素的。遞歸實現。
     *
     * @param a     升序數組
     * @param n     數組大小
     * @param value 要查找的數值
     * @return 返回值表示要查找的數據在數組中的角標,若是沒有則返回-1.
     */
    public static int binarySearch2(int[] a, int n, int value) {
        return binarySearchInternally(a, 0, n - 1, value);
    }

    private static int binarySearchInternally(int[] a, int low, int high, int value) {
        if (low > high) {
            return -1;
        }

        int mid = low + ((high - low) >> 1);
        if (a[mid] == value) {
            return mid;
        } else if (a[mid] < value) {
            return binarySearchInternally(a, mid + 1, high, value);
        } else {
            return binarySearchInternally(a, low, mid - 1, value);
        }
    }
複製代碼
相關文章
相關標籤/搜索