验证二分法是真的正确,所以用暴力遍历和二分法同时处理数组,查看二分法是否编写正确
package cn.Text;
import java.util.Arrays;
/**
二分法
一次找一半,比较找位置/数字(num) 保证有序
注:我们中点位置一般去上中点
135679 上中点为5
/
public class Dichotomy {
//TODO 二分法查找
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的[L...........R]之间查找一个数num
*/
while(L<=R){
int media=(L+R)/2;
if(arr[media]==num){
return true;
}
else if(arr[media]<num){
L=media+1;
}
else{
R=media-1;
}
}
return false;
}
//TODO 遍历,暴力方法解决
public static boolean test(int[] sortedArr, int 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;
}
public static void main(String[] args) {
int testTime = 500000;
int maxSize = 10;
int maxValue = 100;
boolean succeed = true;
for (int i = 0; i < testTime; i++) {
int[] arr = generateRandomArray(maxSize, maxValue);
System.out.println(arr);
Arrays.sort(arr);
int value = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
if (test(arr, value) != find(arr, value)) {
System.out.println("出错了!");
succeed = false;
break;
}
}
System.out.println(succeed ? "Nice!" : "Fucking fucked!");
}
}
运行正确,就是不知道怎么转换为数字
两个一样的,说明二分法正确,我想知道数组怎么打印出
system.out.println(arr[i]);吧应该是
如果要打印数组内的所有元素,需要调用它的toString方法。这里你把相应的println语句换成Arrays.toString(数组名)就OK了
你数组里装的本质上就不是数字,怎么可能转换成数字
除非你把前面的[I@都不要了
后面的按16进制转
计算机上的任何数据其实都是数字。只是根据不同规则显示在屏幕上而已。