You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
6.1 KiB
255 lines
6.1 KiB
package leo.class01_01;
|
|
|
|
|
|
import leo.util.ArrayUtil;
|
|
|
|
/**
|
|
* @author Leo
|
|
* @ClassName BSExist
|
|
* @DATE 2020/11/12 10:14 上午
|
|
* @Description 二分查找是否存在
|
|
*/
|
|
public class BSExist {
|
|
|
|
/**
|
|
* 功能描述 : 在有序数组中,二分查找某数是否存在
|
|
* @author Leo
|
|
* @date 2020/11/12 10:36 上午
|
|
* @param arr 有序数组
|
|
* @param value
|
|
* @return boolean
|
|
*/
|
|
public static boolean exist(int[] arr, int value) {
|
|
if (arr == null || arr.length == 0) {
|
|
return false;
|
|
}
|
|
int L = 0;
|
|
int R = arr.length - 1;
|
|
int mid = 0;
|
|
while (L < R) {
|
|
//右移一位表示除以2
|
|
//mid = (L + R) / 2; 不安全 有溢出的风险
|
|
mid = L + ((R - L) >> 1);
|
|
if (arr[mid] == value) {
|
|
return true;
|
|
} else if (arr[mid] > value) {
|
|
R = mid - 1;
|
|
}else {
|
|
L = mid + 1;
|
|
}
|
|
}
|
|
return arr[L] == value;
|
|
}
|
|
|
|
|
|
public static boolean exist2(int[] arr, int value) {
|
|
|
|
if (arr.length == 0) {
|
|
return false;
|
|
}
|
|
int L = 0;
|
|
int R = arr.length - 1;
|
|
int mid = 0;
|
|
while (L < R) {
|
|
mid = L + ((R - L) >> 1);
|
|
if (arr[mid] == value) {
|
|
return true;
|
|
} else if (arr[mid] > value) {
|
|
R = mid - 1;
|
|
} else if (arr[mid] < value) {
|
|
L = mid + 1;
|
|
}
|
|
}
|
|
return arr[L] == value;
|
|
}
|
|
|
|
|
|
public static boolean exist3(int[] arr, int value) {
|
|
if (arr.length == 0 || arr == null) {
|
|
return false;
|
|
}
|
|
int L = 0;
|
|
int R = arr.length - 1;
|
|
int mid = 0;
|
|
while (L < R) {
|
|
mid = L + ((R - L) >> 1);
|
|
if (arr[mid] == value) {
|
|
return true;
|
|
} else if (arr[mid] > value) {
|
|
R = mid - 1;
|
|
} else if (arr[mid] < value) {
|
|
L = mid + 1;
|
|
}
|
|
}
|
|
return arr[L] == value;
|
|
}
|
|
|
|
|
|
public static boolean exist4(int[] arr, int value) {
|
|
if (arr.length == 0 || arr == null) {
|
|
return false;
|
|
}
|
|
int L = 0;
|
|
int R = arr.length - 1;
|
|
int mid = 0;
|
|
|
|
while (L < R) {
|
|
mid = L + ((R - L) >> 1);
|
|
if (arr[mid] > value) {
|
|
R = mid - 1;
|
|
} else if (arr[mid] < value) {
|
|
L = mid - 1;
|
|
}else{
|
|
return true;
|
|
}
|
|
}
|
|
return arr[L] == value;
|
|
}
|
|
|
|
|
|
public static boolean exist5(int[] arr, int value) {
|
|
if (arr.length <= 0 || arr == null) {
|
|
return false;
|
|
}
|
|
int L = 0;
|
|
int R = arr.length - 1;
|
|
int mid = 0;
|
|
while (L < R) {
|
|
mid = L + ((R - L) >> 1);
|
|
if (arr[mid] > value) {
|
|
R = mid - 1;
|
|
} else if (arr[mid] < value) {
|
|
L = mid + 1;
|
|
}else{
|
|
return true;
|
|
}
|
|
}
|
|
return arr[L] == value;
|
|
}
|
|
|
|
public static boolean exist6(int[] arr, int value) {
|
|
|
|
if (arr.length <= 0 || arr == null) {
|
|
return false;
|
|
}
|
|
int L = 0;
|
|
int R = arr.length - 1;
|
|
int mid = 0;
|
|
while (L < R) {
|
|
mid = L + ((R - L) >> 1);
|
|
if (arr[mid] > value) {
|
|
R = mid - 1;
|
|
} else if (arr[mid] < value) {
|
|
|
|
L = mid + 1;
|
|
}else {
|
|
return true;
|
|
}
|
|
}
|
|
return arr[L] == value;
|
|
}
|
|
|
|
|
|
public static boolean exist7(int[] arr, int value) {
|
|
if (arr.length == 0 || arr == null) {
|
|
return false;
|
|
}
|
|
int L = 0;
|
|
int R = arr.length - 1;
|
|
int mid = 0;
|
|
while (L < R) {
|
|
mid = L + ((R - L) >> 1);
|
|
if (arr[mid] == value) {
|
|
return true;
|
|
} else if (arr[mid] > value) {
|
|
R = mid - 1;
|
|
} else if (arr[mid] < value) {
|
|
L = mid + 1;
|
|
}
|
|
}
|
|
return arr[L] == value;
|
|
}
|
|
|
|
public static boolean exist8(int[] arr, int value) {
|
|
if (arr.length == 0 || arr == null) {
|
|
return false;
|
|
}
|
|
int L = 0;
|
|
int R = arr.length - 1;
|
|
int mid = 0;
|
|
while (L < R) {
|
|
mid = L + ((R - L) >> 1);
|
|
if (arr[mid] > value) {
|
|
R = mid - 1;
|
|
} else if (arr[mid] < value) {
|
|
L = mid + 1;
|
|
}else{
|
|
return true;
|
|
}
|
|
}
|
|
return arr[L] == value;
|
|
}
|
|
|
|
public static boolean exist9(int[] arr, int value) {
|
|
if (arr.length == 0 || arr == null) {
|
|
return false;
|
|
}
|
|
int l = 0;
|
|
int r = arr.length - 1;
|
|
while (l < r) {
|
|
int mid = l + ((r - l) >> 1);
|
|
if (arr[mid] > value) {
|
|
r = mid - 1;
|
|
} else if (arr[mid] < value) {
|
|
l = mid + 1;
|
|
}else{
|
|
return true;
|
|
}
|
|
}
|
|
return arr[l] == value;
|
|
}
|
|
|
|
/**
|
|
* 功能描述 : test
|
|
* @author Leo
|
|
* @date 2020/11/12 10:36 上午
|
|
* @param arr 二分查找某数是否存在
|
|
* @param value
|
|
* @return boolean
|
|
*/
|
|
public static boolean forExist(int[] arr, int value) {
|
|
for (int i : arr) {
|
|
if (i == value) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
public static void main(String[] args){
|
|
|
|
int maxSize = 50;
|
|
int range = 500;
|
|
int testTime = 1000;
|
|
boolean succeed = true;
|
|
for (int i = 0; i < testTime; i++) {
|
|
int[] sortArr = ArrayUtil.randomSortArray(maxSize, range);
|
|
int value = (int) ((range + 1) * Math.random() - (range + 1) * Math.random());
|
|
|
|
if (exist9(sortArr, value) != exist(sortArr, value)) {
|
|
succeed = false;
|
|
ArrayUtil.printArr(sortArr);
|
|
break;
|
|
}
|
|
}
|
|
System.out.println(succeed ? "Nice!" : "Fucking Fucked!");
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|