package drug.search;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author Drug
* @create 2020-04-28 14:26
*/
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {141,141,141,141,1231,1234,1485,1499};
List<Integer> integers = binarySearch2(arr, 0, arr.length, 141);
Collections.sort(integers);
System.out.println(integers);
}
/**
* 二分查找
* @param arr 数组
* @param left 左
* @param right 右
* @param value 查找的数值
* @return
*/
public static int binarySearch(int[] arr,int left,int right,int value){
//递归最后没找到
if(left > right){
return -1;
}
//中间值
int mid = (left+right)/2;
int midValue = arr[mid];
//开始判断中间值和查找值的大小
if(value > midValue){
//向右递归
return binarySearch(arr, mid+1, right, value);
}else if(value < midValue){
//向左递归
return binarySearch(arr, left, mid-1, value);
}else {
//找到了
return mid;
}
}
/**
* 二分查找优化版
* @param arr 数组
* @param left 左
* @param right 右
* @param value 查找的数值
* @return
*/
public static List<Integer> binarySearch2(int[] arr, int left, int right, int value){
//递归最后没找到
if(left > right){
return new ArrayList<>();
}
//中间值
int mid = (left+right)/2;
int midValue = arr[mid];
//存放结果
List<Integer> list = new ArrayList<>();
//开始判断中间值和查找值的大小
if(value > midValue){
//向右递归
return binarySearch2(arr, mid+1, right, value);
}else if(value < midValue){
//向左递归
return binarySearch2(arr, left, mid-1, value);
}else {
//找到了
list.add(mid);
//向右继续找
int temp = mid+1;
while(temp<=right && arr[temp] == value){
list.add(temp);
temp++;
}
//向左继续找
temp = mid-1;
while(temp>=left && arr[temp] == value){
list.add(temp);
temp--;
}
return list;
}
}
}
java二分查找代码实现
最新推荐文章于 2024-02-22 16:25:59 发布