栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 版二分查找算法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 版二分查找算法

二分查找算法
  • 概述
  • 二分查找
  • 总结

概述

  这里我用 Java 语言实现了二分查找算法,虽然该算法的思维非常容易理解,但是在细节之处,比如在查找的边界上有很多值得注意的地方,这里不容小视。

二分查找

  如下是代码所示,请大家注意边界的处理,具体解释的话可以参考这个链接 – 二分查找的几种写法。


public class Test {
    
    public static void main(String[] args) {
        // find 5 in arr[4], arr[5], arr[6]
        int[] arr = {1, 2, 3, 4, 5, 5, 5, 6, 7, 8};

        System.out.println(binSearch(arr, arr.length, 5));
        System.out.println(binSearchFindStart(arr, arr.length, 5));
        System.out.println(binSearchFindEnd(arr, arr.length, 5));
        System.out.println(binSearchAnotherWay(arr, arr.length, 5));
    }

    // 二分查找,左闭右开
    public static int binSearch(int[] arr, int size, int target) {
        int start = 0, end = size;

        while (start < end) {
            int mid = start + (end - start) / 2;  // 防止整数相加溢出

            if (arr[mid] == target)
                return mid;
            else if (arr[mid] < target)
                start = mid + 1;
            else if (arr[mid] > target)
                end = mid;
        }

        return -1;
    }

    // 二分查找,寻找最开始等于目标值的位置
    public static int binSearchFindStart(int[] arr, int size, int target) {
        int start = 0, end = size;
        int flag = -1;

        while (start < end) {
            int mid = start + (end - start) / 2;

            if (arr[mid] == target) {
                flag = 1;  // 表明存在目标值
                end = mid;
            }
            else if (arr[mid] < target)
                start = mid + 1;
            else if (arr[mid] > target)
                end = mid;
        }

        return flag == 1 ? start : flag;
    }

    // 二分查找,寻找最后等于目标值的位置
    public static int binSearchFindEnd(int[] arr, int size, int target) {
        int start = 0, end = size;
        int flag = -1;

        while (start < end) {
            int mid = start + (end - start) / 2;

            if (arr[mid] == target) {
                flag = 1;  // 表明存在目标值
                start = mid + 1;
            }
            else if (arr[mid] < target)
                start = mid + 1;
            else if (arr[mid] > target)
                end = mid;
        }

        return flag == 1 ? end - 1 : flag;
    }

	// 二分查找,闭区间的写法
    public static int binSearchAnotherWay(int[] arr, int size, int target) {
        int start = 0, end = size - 1;

        while (start <= end) {
            int mid = start + (end - start) / 2;

            if (arr[mid] == target) 
                return mid;
            else if (arr[mid] < target) 
                start = mid + 1;
            else if (arr[mid] > target) 
                end = mid - 1;
        }

        return -1;
    }
}



总结

不忘初心,砥砺前行!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/584169.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号