二分查找
!!!要是有序的数组
经典二分
//二分查找
public static int binarysearch(int[] arr, int value, int left, int right){
int l = left;
int r = right-1;
while (l < r){
int mid = (r+l)/2;
if(arr[mid] == value){
return mid;
}else if(arr[mid] < value){
l = mid+1;
}else {
r = mid-1;
}
}
return -1;
}
求中点(防溢出)
int mid = L + ((R-L)>>1)
找大于某个数最左边的位置–大于该值的最小值
找小于某个数最右边的位置–小于该值的最大值
局部最大
无序的数组,相邻数不一定相等
既大于左边又大于右边
局部最小
无序的数组,相邻数不一定相等
既小于左边又小于右边
对数器
//自己写一个数组生成器,测试方法
public static int[] generateRandomArray(int maxSize,int maxValue){
// Math.random() 等概率返回[0,1)一个小数
// N*Math.random() 等概率返回[0,N)一个小数
// (int)(N*Math.random()) 等概率返回[0,N-1)一个整数
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 test(){
int testTime = 50000;
int maxSize = 100;
int maxValue = 100;
boolean succeed = false;
for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize,maxValue);
int[] arr2 = Arrays.copyOf(arr1,arr1.length);
//测试方法
insertionSort(arr1);
Arrays.sort(arr2);
if(!isEqual(arr1,arr2)){
succeed = true;
break;
}
}
System.out.println(succeed? "success" : "fuck");
}