//二分法\对数器

package a;

import java.util.Arrays;

/**
 * @author 真他喵的学不动咯
 * @create 2022-08-08--19:07
 */
public class dichotomy {   //二分法\对数器
    public static void main(String[] args){
        int tesTime=10000;
        int maxSize=10;
        int maxValue=100;
        boolean succeed=true;
        for (int i=0;i<tesTime;i++){
            int[] arr=generateRandomArray(maxSize,maxValue);   //产生最大长度为10,最大值为100的随机长度、随机值的int[]
            Arrays.sort(arr);//对数组进行排序
            int value=(int)((maxValue+1)*Math.random())-(int)(maxValue*Math.random());  //随机产生num
            if ((test(arr,value))!=find(arr,value)){   //对比两方法是不是一模一样
                succeed=false;
                break;
            }
        }
        System.out.println(succeed?"成功":"失败");

    }
    /*
    在有序数组中找num,从小到大排,对半砍
     */
    //二分法,arr是有序数组
    public static boolean find(int[] arr,int num){
        //先写边界条件
        if (arr==null||arr.length==0){
            return false;
        }
        //写普通情况
        int L=0;
        int R=arr.length-1;
        //arr[0,...,N-1]   num
        while (L<=R){  // 当L<=R为有效区间,继续二分
            //如果左边界跑到右边界去【这不符合常理】,说明就没找到,跳出循环,return false
            int mid=(L+R)/2;   //中点位置
            if (arr[mid]==num){   //正在中点位置好找到了
                return true;
            }else if (arr[mid]<num){   //在左边没找到
                L=mid+1;   //L和mid代表的都是指针
            }
            else {   //如果在右边没找到,即arr[mid]>num
                R=mid-1;   //R和mid代表的都是指针
            }
        }
        return false;  //搜不到
    }
    //对数器
    public static boolean test(int[] sortedArr,int num){  //暴力方式,从左往右找,看有没有num
            for (int cur:sortedArr){
                if (cur==num){
                    return true;
                }
            }
            return false;
    }
    //
    public static int[] generateRandomArray(int maxSize,int maxValue){
        int[] arr=new int[(int)((maxSize+1)*Math.random())];
        for (int i=0;i<arr.length;i++){
            arr[i]=(int)((maxValue+1)* Math.random())-(int)(maxValue*Math.random());
        }
        return arr;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值