欢迎访问宙启技术站
智能推送

Java中如何实现二分查找函数?

发布时间:2023-06-11 16:43:01

Java中可以使用递归和循环两种方式来实现二分查找函数,以下分别介绍。

递归实现:

递归实现二分查找函数的基本思想是,每次取区间的中间位置mid,与要查找的元素比较大小,如果mid大于要查找的元素,则在左半边继续查找,否则在右半边继续查找。

具体的实现过程如下:

public static int binarySearch(int[] nums, int target) {

    return binarySearch(nums, 0, nums.length - 1, target);

}

private static int binarySearch(int[] nums, int left, int right, int target) {

    if (left > right) {

        return -1;

    }

    int mid = (left + right) / 2;

    if (nums[mid] == target) {

        return mid;

    } else if (nums[mid] > target) {

        return binarySearch(nums, left, mid - 1, target);

    } else {

        return binarySearch(nums, mid + 1, right, target);

    }

}

在主函数里,调用了一个私有的递归函数,传入了数组、左右边界值和要查找的目标元素。在递归函数里,首先判断左右边界值是否越界,如果是则直接返回-1。然后取区间的中间位置mid,如果mid等于目标元素,则返回mid。否则,如果mid大于目标元素,说明目标元素在左半边,递归查找左半区间;如果mid小于目标元素,说明目标元素在右半边,递归查找右半区间。

循环实现:

循环实现二分查找函数的基本思想是,每次取区间的中间位置mid,与要查找的元素比较大小,如果mid大于要查找的元素,则在左半边继续查找,否则在右半边继续查找。不断重复这个过程,直到找到目标元素或者整个区间缩小为0为止。

具体的实现过程如下:

public static int binarySearch(int[] nums, int target) {

    int left = 0;

    int right = nums.length - 1;

    while (left <= right) {

        int mid = (left + right) / 2;

        if (nums[mid] == target) {

            return mid;

        } else if (nums[mid] > target) {

            right = mid - 1;

        } else {

            left = mid + 1;

        }

    }

    return -1;

}

在主函数里,使用了一个while循环来不断缩小查找区间的范围。循环条件是,左边界值小于等于右边界值。每次循环,都取区间的中间位置mid。如果mid等于目标元素,则返回mid。否则,如果mid大于目标元素,说明目标元素在左半边,将右边界值缩小到mid-1;如果mid小于目标元素,说明目标元素在右半边,将左边界值扩大到mid+1。不断重复这个过程,直到找到目标元素或者整个区间缩小为0为止。

二分查找函数的时间复杂度为O(log n),比线性查找的时间复杂度O(n)更加高效。但是前提是,被查找的数组必须是有序的。如果数组无序,则需要先进行排序操作,时间复杂度会更高。