数据结构和算法

该代码示例展示了如何在Java中使用二分查找法搜索有序数组中的特定数值。主要包含两个版本的二分查找函数,一个基础版和一个改动版,通过不断缩小搜索范围找到目标值的索引。如果找不到目标值,则返回-1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分查找

public class BinarySearchDemo {

    public static void main(String[] args) {

        // 定义一个排序好的数组,必须是有序数组
        int[] nums = {12,34,45,65,67,78,90,98,101,123,343} ;
        // 需要查找的值
        int searchNum = 90 ;

        System.out.println(searchNum(nums,searchNum));
        System.out.println(searchNumChange(nums,searchNum));

        // java API实现
        System.out.println(Arrays.binarySearch(nums, 101)); ;

    }

    /**
     * 二分查找普通版
     * @param nums
     * @param searchNum
     * @return
     */
    public static int searchNum(int[] nums , int searchNum) {

        // 定义开始和结束位置
        int start = 0 , end = nums.length - 1 ;
        // 定义一个循环不断的折中寻找
        while (start <= end) {
            // 定位出中间元素的索引
            // int arrIndex = (start+end)/2;
            // 解决起始和最后元素相加超出int范围解决方式,通过右移运算符 >>>,移动到java能表示的整数位
            int arrIndex = (start+end) >>> 1;
            // 拿当前元素中与中间元素值进行比较
            if(searchNum < nums[arrIndex]) {
                // 当前元素大于中间元素,往右找,起始位置要改变
                end = arrIndex - 1;
            }else if(nums[arrIndex] < searchNum ) {
                // 当前元素小于中间元素,往左找,末尾位置要改变
                start = arrIndex + 1;
            }else if(searchNum == nums[arrIndex]){
                return arrIndex ;
            }
        }
        return -1;
    }

    /**
     * 二分查找-改动版
     * @param nums
     * @param searchNum
     * @return
     */
    public static int searchNumChange(int[] nums , int searchNum) {

        // 改动第一处
        int start = 0 , end = nums.length ;

        // 改动第二处
        while (start < end) {
            int arrIndex = (start+end) >>> 1;
            if(searchNum < nums[arrIndex]) {
                // 改动第三处
                end = arrIndex;
            }else if(nums[arrIndex] < searchNum ) {
                start = arrIndex + 1;
            }else if(searchNum == nums[arrIndex]){
                return arrIndex ;
            }
        }
        return -1;

    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值