二分查找

public class BinarySearch {

    /**
     * 普通二分查找
     * @param arr
     * @param key
     * @return
     */
    private static boolean search(int[] arr, int key) {
        if (arr == null || arr.length == 0) {
            return false;
        }
        int l = 0, r = arr.length - 1;

        while (l <= r) {
            int m = (l + r) >>> 1;
            if (arr[m] == key) {
                return true;
            } else if (arr[m] < key) {
                l = m + 1;
            } else {
                r = m - 1;
            }
        }
        return false;
    }

    /**
     * 寻找第一个 >= key 的位置
     * @param arr
     * @param key
     * @return
     */
    private static int lowerBound(int[] arr, int key) {

        int l = 0, r = arr.length - 1;

        while (l <= r) {
            int m = (l + r) >>> 1;

            if (arr[m] < key) {
                l = m + 1;
            } else {
                r = m - 1;
            }
        }
        return l;
    }

    /**
     * 寻找第一个 > key 的位置
     * @param arr
     * @param key
     * @return
     */
    private static int upperBound(int[] arr, int key) {

        int l = 0, r = arr.length - 1;

        while (l <= r) {
            int m = (l + r) >>> 1;

            if (arr[m] <= key) {
                l = m + 1;
            } else {
                r = m - 1;
            }
        }
        return l;
    }
}
posted @ 2021-10-12 06:41  Tianyiya  阅读(31)  评论(0)    收藏  举报