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;
}
}
02-20
53
10-06
226
09-30
548