二分法查找

本文详细探讨了二分查找算法的工作原理,包括其在有序数组中的应用,以及如何通过递归和迭代两种方式实现。此外,还分析了二分查找的时间复杂度和优化策略,帮助读者更好地理解和掌握这一高效搜索算法。

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

package com.ldy.arithmetic;

import java.util.Arrays;

public class BinarySearch {

    public static void main(String[] args)
    {
        String[] s={"1","2","3","4","5","6","7","8"};
//        int value = binarySearchForString(s,"a");
        int value=binarySearchForString(s,"7");
//        int value= Arrays.binarySearch(s,"7");
//        int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9};
//        int value = binarySearchForInteger(a, 1);
        System.out.println(value);
    }
    //用于查找字符类型,此处使用的是Arrays.binarySearch二分查找的源码
    private static int binarySearchForString(String[] s, String a) {
        int startIndex=0;
        int endIndex=s.length-1;
        while(startIndex<=endIndex){
            int middleIndex=(startIndex+endIndex)>>>1;
//            Comparable midVal = s[middleIndex];
//            int i = midVal.compareTo(a);
            //String类型实现了Comparable接口,可以直接调用comparableTo方法
            int i =s[middleIndex].compareTo(a);
            if(i<0){
                startIndex=middleIndex+1;
            }else if(i>0){
                endIndex=middleIndex-1;
            }else{
                return middleIndex;
            }
        }
        return -1;
    }
    //用于查找数字类型
    public static int binarySearchForInteger(int[] array, int value) {
        int startIndex = 0;
        int endIndex = array.length - 1;
        while(startIndex <= endIndex)
        {
            // >>>1等价于(startIndex + endIndex)/2.>>>属于无符号右移,所得结果都为正数。
            // >>属于有符号右移,结果可正可负,视情况而定
            int middleIndex = (startIndex + endIndex) >>>1;
            if(value == array[middleIndex])
            {
                return middleIndex;
            }
            if(value > array[middleIndex])
            {
                startIndex = middleIndex + 1;
            }
            if(value < array[middleIndex])
            {
                endIndex = middleIndex - 1;
            }
        }
        return -1;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值