一、基本二分查找
public class BinarySearch {
public static void main(String[] args) {
int[] nums = new int[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21};
Integer target = 9;
Integer index = binarySearch(nums, target);
if(index == -1){
System.out.println( "数组中不存在值为["+ target +"]的元素!");
}else{
System.out.println( target + "的索引为===》》》" + index);
}
}
private static Integer binarySearch(int[] nums, Integer target) {
Integer left = 0;
Integer right = nums.length - 1;
while (left <= right){
int mid = (left + right) / 2;
System.out.println("mid的值===》" + mid);
if(nums[mid] == target){
return mid;
}else if(target > nums[mid]){
left = mid + 1;
System.out.println("left的值===》" + left);
}else if(target < nums[mid]){
right = mid - 1;
System.out.println("right的值===》" + right);
}
}
return -1;
}
}
二、左边界二分查找
public class LeftBoundSearch {
public static void main(String[] args) {
int[] nums = new int[]{1,2,2,2,3,3};
Integer target = 3;
Integer index = left_bound_search(nums, target);
if(index == -1){
System.out.println( "数组中查询不到值为["+ target +"]的元素!");
}else{
System.out.println( target + "最左边的索引为===》》》" + index);
}
}
private static Integer left_bound_search(int[] nums, Integer target) {
if(nums.length == 0){
return -1;
}
if(target < nums[0] || target > nums[nums.length - 1]){
return -1;
}
Integer left = 0;
Integer right = nums.length - 1;
while (left <= right){
int mid = (left + right) / 2;
System.out.println("mid的值===》" + mid);
if(target == nums[mid]){
right = mid - 1;
}else if(target > nums[mid]){
left = mid + 1;
System.out.println("left的值===》" + left);
}else if(target < nums[mid]){
right = mid - 1;
System.out.println("right的值===》" + right);
}
}
if(nums[left] != target){
return -1;
}
return left;
}
}
三、右边界二分查找
public class RightBoundSearch {
public static void main(String[] args) {
int[] nums = new int[]{1,2,2,3};
Integer target = 2;
Integer index = right_bound_search(nums, target);
if(index == -1){
System.out.println( "数组中查询不到值为["+ target +"]的元素!");
}else{
System.out.println( target + "最右边的索引为===》》》" + index);
}
}
private static Integer right_bound_search(int[] nums, Integer target) {
if(nums.length == 0){
return -1;
}
if(target < nums[0] || target > nums[nums.length - 1]){
return -1;
}
Integer left = 0;
Integer right = nums.length - 1;
while (left <= right){
int mid = (left + right) / 2;
System.out.println("mid的值===》" + mid);
if(target == nums[mid]){
left = mid + 1;
}else if(target > nums[mid]){
left = mid + 1;
System.out.println("left的值===》" + left);
}else if(target < nums[mid]){
right = mid - 1;
System.out.println("right的值===》" + right);
}
}
return right;
}
}