二分查找

public class Demo {
    public static void main(String[] args) {
        int[] arr={1,5,22,22,22,88,2032,5823};
        List<Integer> sort = sort(arr, 0, arr.length, 22);
        System.out.println(sort);
    }

    public static List<Integer> sort(int[] arr,int left,int right,int findValue){
        //取出中间的索引
        int mid=(left+right)/2;
        //找到中间的值
        int midVal=arr[mid];
        //如果查找的值不存在,当往右查找时,到数组最大索引还没找到,结束递归,返回-1
        if(left>right){
            return new ArrayList<>();
        }
        //如果要查找的数大于mid往右边递归
        if(findValue>midVal){
           return sort(arr,mid+1,right,findValue);
        }else if(findValue<midVal){
            //如果要找的数小于中间的数往左递归
          return  sort(arr,left,mid-1,findValue);
        }else {
            //找到,返回查找的值,有重复数据,往左右扫描
            //往左扫描
            int temp=mid-1;
            List<Integer> resultIndexs = new ArrayList<>();
            while (true){
                if(temp<0||arr[temp]!=findValue){//退出
                    break;
                }
                resultIndexs.add(temp);
                temp-=1;
            }
            resultIndexs.add(mid)  ;
            temp=mid+1;
            while (true){
                if(temp>arr.length-1||arr[temp]!=findValue){//退出
                    break;
                }
                resultIndexs.add(temp);
                temp+=1;
            }

            return resultIndexs;
        }
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值