二分查找

二分查找

1.二分查找分为普通查找,寻找相等元素第一个位置,相等元素最后一个位置。
2.还需要注意的是mid的计算,采用mid=low+(high-low)/2是为了避免这种计算方式mid=(low+high)/2,当low和high较大时,超出数据类型允许的范围。

public class BinarySearch {
    //设置mid,mid=low+(high-low)/2,保证整个公式不超出其数据类型范围;
    //若设置mid=(low+high)/2,则若此时low和high都比较大,则low+high会超出相应的数据类型范围。
    public int binarySearch(int[] arr, int val) {
        int low = 0;
        int high = arr.length - 1;
        int mid = 0;
        while (low <= high) {
            mid = low + (high - low) / 2;
            if (val < arr[mid])
                high = mid - 1;
            else if (val > arr[mid])
                low = mid + 1;
            else
                return mid;//找到相等的元素后,更新high值
        }
        return -1;
    }

    //寻找首次出现目标值的元素,此时设置变量index,令index等于与目标值相等的下标。然后更新high值,在相等元素值的左侧继续查找;
    // 直到high比low的位置小,此时比较low位置的元素是否等于目标值,若等于则更新index,返回index;若不等于,则直接返回index
    public int firstBinarySearch(int[] arr, int val) {
        int low = 0;
        int high = arr.length - 1;
        int index = 0;
        int mid = 0;
        while (low <= high) {
            mid = low + (high - low) / 2;
            if (val < arr[mid])
                high = mid - 1;
            else if (val > arr[mid])
                low = mid + 1;
            else {
                index = mid;
                high = mid - 1;
            }

        }
        return index;
    }

    //寻找最后一次出现目标值的元素,设置变量index,令index等于与目标值相等的下标。然后更新low值,在相等元素值的右侧继续查找;
    // 直至low比high的位置大,返回index
    public int lastBinarySearch(int[] arr, int val) {
        int low = 0;
        int high = arr.length - 1;
        int index = 0;
        int mid = 0;
        while (low <= high) {
            mid = low + (high - low) / 2;
            if (val < arr[mid])
                high = mid - 1;
            else if (val > arr[mid])
                low = mid + 1;
            else {
                index = mid;
                low = mid + 1;
            }
        }
        return index;
    }

    public static void main(String[] args) {
        BinarySearch bs = new BinarySearch();
        int arr[] = {1, 1, 1, 1, 2, 4, 4, 12, 24};
        int i = 1;
        System.out.print("二分查找:" + bs.binarySearch(arr, i));
        System.out.println();
        System.out.print("返回第一个相等元素下标:" + bs.firstBinarySearch(arr, i));
        System.out.println();
        System.out.print("返回最后一个相等元素下标" + bs.lastBinarySearch(arr, i));
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值