日拱一卒#二分查找#

168 阅读1分钟

认识二分查找

二分查找也叫折半查找。当我们要从一个序列中查找一个元素的时候,二分查找是一种非常快速的查找算法。

二分查找是针对有序集合的查找算法,如果是无序集合就遍历查找。二分查找之所以快是因为它在匹配不成功的时候,每次都能排除剩余元素中一半的元素。因此可能包含目标元素的有效范围就收缩的快。

例子:

一个有序的数组中查找某个数字是否存在。

public class BinarySearch {
    public static void main(String[] args) {
        // 有序数组
        int[] nums = {2,3,5,13,22,32,45,67,72};
        System.out.println(binarySearch(nums,32));
    }

    public static int binarySearch(int nums[],int target){
        // 低位索引
        int low = 0;
        // 高位索引
        int high = nums.length -1;
        // 中间索引
        int mid = 0;
        while (low<=high){
            mid = (low+high)/2;
            // 等于半数
            if(target == nums[mid]){
                return mid;
            }
            // 半数以内
            else if(target<nums[mid]){
                high = mid -1;
            }else {
                // 半数以外
                low = mid +1;
            }
        }
        return -1;
    }

}

递归实现二分查找

/**
 * 二分查找算法
 * <p>
 * 二分查找是针对有序集合的查找算法
 * 如果是无需集合就遍历查找
 * <p>
 * 核心思想:
 * 二分查找快的原因,每次匹配不成功的时候都能剔除调一半的元素
 *
 * 递归
 */
public class BinarySearch {
    public static void main(String[] args) {
        // 有序数组
        int[] nums = {2,3,5,13,22,32,45,67,72};
        System.out.println(bsearch(nums,nums.length,13));
    }
    public static int bsearch(int[] a, int n, int val){
        return bsearchInternally(a,0,n-1,val);
    }

    private static int bsearchInternally(int[] a, int low, int high, int value) {
        if(low > high){
            return  -1;
        }
        int mid = (low + high)/2;
        if(a[mid] == value){
            return mid;
        }else if(a[mid] < value){
            return bsearchInternally(a,mid +1,high,value);
        }else {
            return bsearchInternally(a,low,mid-1,value);
        }
    }
}