Java二分搜索
Java二分搜索适用于已经排列好的数组,若数组未排序可用Arrays.sort()进行排序
import java.util.Arrays;
public class Case {
public static void main(String[] args) {
int[] arr = {33, 23, 99, 87, 91, 78, 45};
//排序
Arrays.sort(arr);
//打印
System.out.println(Arrays.toString(arr));
}
}
若数组内数字无重复
//二分查找
public class Case001 {
public static void main(String[] args) {
int[] arr = {23, 33, 45, 78, 87, 91, 99};
System.out.println(search(arr, 0, arr.length - 1, 20));
}
public static int search(int[] arr, int left, int right, int value) {//若找到就返回下标,找不到就返回-1
if (left > right) {//若left大于right则说明找不到
return -1;
}
int mid = (left + right) / 2;
int midval = arr[mid];
if (value > midval) {//说明查找的数在mid的右边
return search(arr, mid + 1, right, value);
} else if (value < midval) {//说明查找的数在mid的左边
return search(arr, left, mid - 1, value);
} else {
return mid;
}
}
}
若数组中数字有重复
import java.util.ArrayList;
//二分查找
public class Case001 {
public static void main(String[] args) {
int[] arr = {23, 23, 33, 45, 78, 87, 91, 99};
System.out.println(search(arr, 0, arr.length - 1, 23));
}
public static ArrayList<Integer> search(int[] arr, int left, int right, int value) {//若找到就返回下标,找不到就返回-1
if (left > right) {//若left大于right则说明找不到
return new ArrayList<Integer>();
}
int mid = (left + right) / 2;
int midval = arr[mid];
if (value > midval) {//说明查找的数在mid的右边
return search(arr, mid + 1, right, value);
} else if (value < midval) {//说明查找的数在mid的左边
return search(arr, left, mid - 1, value);
} else {
ArrayList<Integer> res = new ArrayList<Integer>();
res.add(mid);
//因为数组是排序完的所以在mid的基础上
//再在mid左边遍历搜索
int i = mid - 1;
while (i >= 0 && arr[i] == value) {
res.add(i);
i--;
}
//在mid右边遍历搜索
i = mid + 1;
while (i <= arr.length - 1 && arr[i] == value) {
res.add(i);
i++;
}
return res;
}
}
}