二分查找
package Search;
import java.util.ArrayList;
import java.util.List;
/**
* @author lxy
* @version 1.0
* @date 2020/10/19 19:18
* 二分查找
* 必须是有序数组
*/
public class BrigthSearch {
public static void main(String[] args) {
int[] arr =new int[]{1,2,2,2,4,5};
List<Integer> integerList =FindVal(arr,6);
System.out.println(integerList);
}
/**------------------------------------------------------------------------------*/
public static List<Integer> FindVal(int[] arr,int findval){
List<Integer> Consequence = new ArrayList<>();
int end =arr.length-1;
int start = 0;
int mid ;
if (findval>arr[end]||findval<arr[start]){
return null;
}
while (start<=end){
mid = (start+end)/2;
//查找的值小于中间值即在中间值左边
if (arr[mid]>findval){
//结束的位置为中间位置
end = mid;
}else{
//查找的值大于中间值即在中间值右边
if (arr[mid]<findval){
//开始的位置为中间位置
start =mid;
}else/*findval等于arr[mid]*/{
//判断前一个位置是否等于中间位置
while(arr[mid-1] == findval){
mid -=1;
}
Consequence.add(mid);
/***
* 此处作用:若中间元素的前一个元素等于中间元素,则此时mid = mid-1;此处便会将mid添加到列表
* 若后一个元素等于中间元素则将mid添加到列表中后将mid+1添加到列表
*/
while(arr[mid+1] == findval){
Consequence.add(mid+1);
mid+=1;
}
return Consequence;
}
}
}
return Consequence;
}
}