package com.datastructure.lookupalgorithm;
import java.util.ArrayList;
import java.util.List;
/**
* 二分查找
* 数组必须是有序的
*/
public class BinarySearch {
public static void main(String[] args) {
// int[] arr = {1,2,3,4,5,6,7,8,9};
// int position = binarySearch(arr,0,arr.length-1,1);
// System.out.println(position);
int[] arr = {1,2,3,4,5,5,5,6,7,8,9};
List<Integer> position = otherBinarySearch(arr,0,arr.length-1,5);
System.out.println(position);
}
//二分查找
public static int binarySearch(int[] arr,int left,int right,int val){
//当left>right的时候,说明遍历了整个的数组,都没有找到数据
if (left>right){
return -1;
}
//中间值的索引
int mid = (left+right)/2;
//中间值
int midVal = arr[(left+right)/2];
if (val<midVal){
return binarySearch(arr,left,mid,val);
}else if (val>midVal){
return binarySearch(arr,mid+1,right,val);
}else {
return mid;
}
}
//改进版二分查找,可以查找多个相同元素的位置
public static List<Integer> otherBinarySearch(int[] arr,int left,int right,int val){
if (left>right){
return new ArrayList<Integer>();
}
int mid = (left+right)/2;
int midVal = arr[(left+right)/2];
if (val<midVal){
return otherBinarySearch(arr,left,mid,val);
}else if (val>midVal){
return otherBinarySearch(arr,mid+1,right,val);
}else {
List<Integer> list = new ArrayList<>();
int temp = mid-1;
list.add(mid);
while (true){
if (temp<0||arr[temp]!=val){
break;
}
list.add(temp);
temp--;
}
temp = mid+1;
while (true){
if (temp>right||arr[temp]!=val){
break;
}
list.add(temp);
temp++;
}
return list;
}
}
}
二分查找
最新推荐文章于 2023-02-14 19:02:03 发布