import java.util.Arrays;
import java.util.Random;
public class TwoDivideDemo02 {
public static void main(String[] args) {
//要求测试50万次
int testTime = 500000;
//成功的话succeed=true
boolean succeed = true;
//得生成一个随机有序数组,数组的最大长度是maxSize,最大值是maxValue
int maxSize = 50;
int maxValue = 100;
//先写一个随机数产生器
Random ran = new Random();
for (int i = 0; i < testTime; i++) {
//自定义一个方法生成一个随机有序数组
int[] arr = generateArray(maxSize, maxValue);
//产生一个要找的数
int num = ran.nextInt(maxValue)+1;
//利用二分法找到大于等于这个数的最左侧的位置
int index1 = erFenMethod(arr, num);
//利用遍历的方法找到大于等于某个数的最左侧的位置
int index2 = bianli(arr,num);
//比较两个方法找到的索引值是否相同
if(index1 != index2) {
succeed = false;
System.out.println("第 "+i+" 次");
System.out.print("从"+Arrays.toString(arr));
System.out.println("找"+num);
System.out.println(index1);
System.out.println(index2);
break;
}
}
System.out.println(succeed ? "Nice!" : "Fuck!");
}
//定义一个产生随机有序数组的方法
public static int[] generateArray(int maxSize, int maxValue) {
Random r = new Random();
int[] arrayA = new int[r.nextInt(maxSize)+1]; //数组的长度为[1,maxSize]
//给数组赋值
for (int i = 0; i < arrayA.length; i++) {
arrayA[i] = r.nextInt(maxValue)+1; //每个值的范围是[1,maxValue]
}
//给数组排序
Arrays.sort(arrayA);
return arrayA;
}
//定义一个二分法,找到大于等于这个数的最左侧的位置二分法找到大于等于这个数的最左侧的位置
public static int erFenMethod(int[] array, int number) {
int L = 0 ;
int R = array.length-1;
int index = -1;
while(L <= R) {
int mid = L +( (R-L)>>1 );
if(array[mid] >= number) {
index = mid;
R = mid - 1;
}
else if(array[mid] < number) {
L = mid +1;
}
}
return index;
}
//定义一个遍历的方法,找到大于等于某个数的最左侧的位置
public static int bianli(int[] array, int number) {
int index = -1;
for (int i = 0; i < array.length; i++) {
if(array[i] >= number) {
index = i;
break;
}
}
return index;
}
}