import java.util.ArrayList;
import java.util.List;
public class BinarySearch {
public static void main(String[] args) {
int[] arr1 = {-1, -1, 1, 4, 9, 19, 19, 19, 34};
List<Integer> index1 = binarySearch(arr1, 0, arr1.length -1, 19);
// 递归方法
if (index1.size() == 0) {
System.out.println("该数未找到!");
} else {
System.out.println("该数在第" + index1 + "位。");
}
// 非递归方法,简单一点
int[] arr2 = {-1, 1, 4, 9, 19, 34};
int index2 = binarySearch(arr2, 19);
if (index2 == -1) {
System.out.println("该数未找到!");
} else {
System.out.println("该数在第" + index2 + "位。");
}
}
// 二分查找的前提是:该数组是有序的
// 时间复杂度O(log2n),最多需要查找7次,2^6 < 100 < 2^7
// 递归方法
public static List<Integer> binarySearch(int[] arr, int start, int end, int value) {
if (start <= end && value >= arr[0] && value <= arr[arr.length - 1]) {
int mid = (start + end) / 2;
int midValue = arr[mid];
if (value < midValue) {
return binarySearch(arr, start, mid - 1, value);
} else if (value > midValue) {
return binarySearch(arr, mid + 1, end, value);
} else {
// 找到下标mid之后,查找mid左边和右边同样满足的元素,加到集合ArrayList中
List<Integer> list = new ArrayList<>();
int temp1 = mid - 1;
while (temp1 >= 0 && arr[temp1] == value) {
list.add(temp1);
// temp左移,寻找左边同样相等的数组元素
temp1--;
}
list.add(mid);
int temp2 = mid + 1;
while (temp2 <= arr.length - 1 && arr[temp2] == value) {
list.add(temp2);
// temp左移,寻找左边同样相等的数组元素
temp2++;
}
return list;
}
}
return new ArrayList<>();
}
// 非递归方法
public static int binarySearch(int[] arr, int value) {
int start = 0;
int end = arr.length - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (arr[mid] == value) {
return mid;
} else if (arr[mid] < value) {
start = mid + 1;
} else {
end = mid - 1;
}
}
return -1;
}
}
algorithm:二分查找
最新推荐文章于 2024-08-19 19:54:18 发布