二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是目标值,则搜索过程结束;如果目标值大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,并且同样从中间元素开始比较。
package com.example.datastructures.search;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author maoyouhua
* @version jdk21
*
* 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。
* 搜索过程从数组的中间元素开始,如果中间元素正好是目标值,则搜索过程结束;
* 如果目标值大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,
* 并且同样从中间元素开始比较。
*/
public class BinarySearch {
/**
*
* @param arr 待查找的数组
* @param findValue 待查找的值
* @param left 查找范围左下标
* @param right 查找范围右下标
* @return
*/
public static List binarySearch(int[] arr, int findValue, int left, int right){
List<Integer> list = new ArrayList<>();
if (left <= right) {
int mid = (left + right) / 2;
if (findValue < arr[mid]) {
return binarySearch(arr,findValue,left,mid - 1);
} else if (findValue > arr[mid]) {
return binarySearch(arr,findValue,mid + 1,right);
}else if (findValue == arr[mid]) {
//向左遍历
int index = mid - 1;
while (index >= 0 && arr[index] == findValue) {
list.add(index--);
}
index = mid + 1;
while (index < arr.length && arr[index] == findValue) {
list.add(index++);
}
list.add(mid);
return list.stream().sorted().collect(Collectors.toList()); // StreamAPI排序
}
}
return list;
}
/**
* list :[3, 4, 5, 6, 7, 8]
* @param args
*/
public static void main(String[] args) {
int[] arr = {1,8,10,89,89,89,89,89,89,1000,1234};
List list = binarySearch(arr, 89, 0, arr.length - 1);
System.out.println("list :" + list);
}
}