算法-二分查找

二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。

	public static int binarySearch(int[] source, int target) {
        int low = 0, high = source.length - 1, mid = 0;

        if (target < source[low] || target > source[high] || low > high) {
            return -1;
        }

        while (low <= high) {
            // 防止low比high大溢出情况: mid = low + ((high - low) >> 1);
            mid = (low + high) / 2;
            if (source[mid] > target) {
                // 比关键字大则关键字在左区域
                high = mid - 1;
            } else if (source[mid] < target) {
                // 比关键字小则关键字在右区域
                low = mid + 1;
            } else {
                return mid;
            }
        }
        // 最后仍然没有找到,则返回-1
        return -1;
    }

    public static int recursionBinarySearch(int[] source, int target, int low, int high) {
        if (target < source[low] || target > source[high] || low > high) {
            return -1;
        }
        // 初始中间位置
        int mid = (low + high) / 2;
        if (source[mid] > target) {
            // 比关键字大则关键字在左区域
            return recursionBinarySearch(source, target, low, mid - 1);
        } else if (source[mid] < target) {
            // 比关键字小则关键字在右区域
            return recursionBinarySearch(source, target, mid + 1, high);
        } else {
            return mid;
        }
    }


	public static void main(String[] args) {
        int[] source = {1, 2, 3, 4, 5, 6, 7};

        int key = binarySearch(source, 3);

        System.out.println(String.format("key=[%s]", key));
    }

你可能感兴趣的:(算法)