package dataStruct.查找算法;
import java.util.ArrayList;
import java.util.Arrays;
public class 二分查找法 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4,4, 5, 6, 23, 43, 234};
ArrayList<Integer> list = binarySearch1(arr, 0, arr.length - 1, 4);
System.out.println(Arrays.toString(list.toArray()));
}
/**
* //二分查找法,如果要查找的值比中值小左递归,比他大,有递归,相等返回下标,不相等返回-1
*
* @param arr 在arr中查找需要查找的数字
* @param left 数组的左端点
* @param right 数组的右端点
* @param findValue 需要查找的值
*/
//以下方法,将所有重复的数的下标打印
public static int binarySearch(int[] arr, int left, int right, int findValue) {
if (left > right) {
return -1;
}
int mid = left + (right - left) / 2;
//二分递归的出口,left>right
if (findValue > arr[mid]) {//要查找的数比中值大,又递归
return binarySearch(arr, mid + 1, right, findValue);
} else if (findValue < arr[mid]) {
return binarySearch(arr, left, mid - 1, findValue);
} else {
return mid;
}
}
//以下方法可以将重复数的全部下标返回,返回多个下标
/*
思路:
1.将方法返回值设置成一个集合ArrayList
2.将找到mid以后,遍历mid左边的数,并将下标返回添加到数组中
3.向右遍历
4.最终返回集合
*/
public static ArrayList<Integer> binarySearch1(int[] arr, int left, int right, int findValue) {
if (left > right) {
return new ArrayList<Integer>();
}
int mid = left + (right - left) / 2;
//二分递归的出口,left>right
if (findValue > arr[mid]) {//要查找的数比中值大,又递归
return binarySearch1(arr, mid + 1, right, findValue);
} else if (findValue < arr[mid]) {
return binarySearch1(arr, left, mid - 1, findValue);
} else {
ArrayList<Integer> list = new ArrayList<>();
int temp = mid;
while(true){
if (arr[temp] == findValue && temp > 0){
list.add(temp);
temp--;
}else {
break;
}
}
temp = mid +1;
while(true){
if (arr[temp] == findValue && temp < arr.length){
list.add(temp);
temp++;
}else {
break;
}
}
return list;
}
}
}
查找算法之二分查找法
猜你喜欢
转载自blog.csdn.net/qq_52655865/article/details/122068897
今日推荐
周排行