package com.study.data.structures.search;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 对有序数组进行二分查找
* {23, 45, 67, 86, 86, 90, 91}
* 查找45:
* 第一次查找:left=0,right=arr.length-1
* middleIndex = (0+7)/2=3
* middleValue = 86>45,所以继续向左查找
* <p>
* 第二次查找:left=0,right=2
* middleIndex = (0+2)/2=1
* middleValue = 45==45,所以返回当前middleIndex
* =========================================================
* 如果查找的是有序数组中不存在的数50
* {23, 45, 67, 86, 86, 90, 91}
* 第一次查找:left=0,right=arr.length-1
* middleIndex = (0+7)/2=3
* middleValue = 86>50,所以继续向左查找
* <p>
* 第二次查找:left=0,right=2
* middleIndex = (0+2)/2=1
* middleValue = 45<50,所以向右查找
* <p>
* 第三次查找:left=2,right=2
* (为什么left与right相等的时候不停止查找呢?因为如果middleIndex=2,此时middleValue=50呢?,所以left与right相等的时候需要比较一次,而不是结束循环)
* middleIndex = (2+2)/2=2
* middleValue = 67>50,所以向左查找
* <p>
* 第四次查找:left=2,right=1
* left>right,此时就是结束递归的关键点,因为两端的下标已经发生重合
*/
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {23, 45, 67, 86, 86, 90, 91};
int index = binarySearch(arr, 0, arr.length - 1, 86);
System.out.println("当前值::" + index);
List<Integer> integers = binarySearch2(arr, 0, arr.length - 1, 86);
System.out.println(integers);
}
public static int binarySearch(int[] arr, int left, int right, int searchNumber) {
if (left > right) {
return -1;
}
int middleIndex = (left + right) / 2;
int middleValue = arr[middleIndex];
//小于中间值,则向左查询
if (middleValue > searchNumber) {
return binarySearch(arr, left, middleIndex - 1, searchNumber);
} else if (middleValue < searchNumber) {
return binarySearch(arr, middleIndex + 1, right, searchNumber);
} else {
return middleIndex;
}
}
public static List<Integer> binarySearch2(int[] arr, int left, int right, int searchNumber) {
if (left > right) {
return new ArrayList<>();
}
int middleIndex = (left + right) / 2;
int middleValue = arr[middleIndex];
//小于中间值,则向左查询
if (middleValue > searchNumber) {
return binarySearch2(arr, left, middleIndex - 1, searchNumber);
} else if (middleValue < searchNumber) {
return binarySearch2(arr, middleIndex + 1, right, searchNumber);
} else {
List<Integer> resultIndex = new ArrayList<>();
int temp = middleIndex - 1;
//向左寻找
while (true) {
if (temp < 0 || arr[temp] != searchNumber) {
break;
}
resultIndex.add(temp);
temp--;
}
resultIndex.add(middleIndex);
temp = middleIndex + 1;
//向右寻找
while (true) {
if (temp > arr.length - 1 || arr[temp] != searchNumber) {
break;
}
resultIndex.add(temp);
temp++;
}
return resultIndex;
}
}
}
算法学习记录011_二分查找
最新推荐文章于 2024-07-10 16:47:58 发布