package DataStructure;
import java.util.ArrayList;
import java.util.Arrays;
public class ErFenSearch {
public static void main(String[] args) {
int[] arr = {9, 2, 2, 8, 2, 3, 4, 2, 1};
ChooseSort.sort(arr);
System.out.println(Arrays.toString(arr));
// int result = search(arr, 20);
// int result = search2(arr, 0, arr.length - 1, 2);
ArrayList<Integer> result = searchAll(arr, 0, arr.length - 1, 2);
System.out.println(result.size() == 0 ? "无该值" : "索引为:" + result);
}
// 不使用递归
public static int search(int[] arr, int i){
int begin = 0;
int end = arr.length - 1;
while (begin <= end){
int mid = (begin + end) / 2;
if(arr[mid] == i){
return mid;
}else if(arr[mid] < i){
begin = mid + 1;
}else{
end = mid -1;
}
}
return -1;
}
// 使用递归
public static int search2(int[] arr, int begin, int last, int i){
if (begin > last) {
return -1;
}
int mid = (begin + last) / 2;
if (arr[mid] > i) {
return search2(arr, begin, mid - 1, i);
}else if (arr[mid] < i) {
return search2(arr, mid + 1, last, i);
}else {
return mid;
}
}
// 返回重复值的所有索引
public static ArrayList<Integer> searchAll(int[] arr, int begin, int last, int i){
if (begin > last) {
return new ArrayList<>();
}
int mid = (begin + last) / 2;
if (arr[mid] > i) {
return searchAll(arr, begin, mid - 1, i);
}else if (arr[mid] < i) {
return searchAll(arr, mid + 1, last, i);
}else {
// 使用集合收集索引
ArrayList<Integer> list = new ArrayList<>();
list.add(mid);
int leftIndex = mid - 1;
int rightIndex = mid + 1;
while (leftIndex > 0 && arr[leftIndex] == i) {
list.add(leftIndex--);
}
while (rightIndex < arr.length && arr[rightIndex] == i) {
list.add(rightIndex++);
}
return list;
}
}
}
二分查找
最新推荐文章于 2023-05-28 13:59:52 发布