二分查找:要求在有序数组中
package search;
//数组是有序的
public class BinarySearch {
public static void main(String args[]){
int arr[] = {
1,8,10,89,1000,1234};
int resIndex = binarySearch(arr,0,arr.length-1,12345);
System.out.println("resIndex=" + resIndex);
}
//二分查找 如果找到返回下标,否则-1
public static int binarySearch(int[] arr,int left,int right,int findVal){
//当left》right结束,没有找到
if (left>right){
return -1;
}
int mid = (left+right)/2;
int midVal = arr[mid];
if (findVal>midVal){
//向右递归
return binarySearch(arr,mid+1,right,findVal);
}else if (findVal<midVal){
//左递归
return binarySearch(arr,left,mid-1,findVal);
}else {
return mid;
}
}
}
package search;
import java.util.ArrayList;
//数组是有序的
public class BinarySearch {
public static void main(String args[]){
int arr[] = {
1,8,10,89,1000,1000,1234};
ArrayList resIndex = binarySearch2(arr,0,arr.length-1,1000);
System.out.println("resIndex=" + resIndex);
}
//二分查找 如果找到返回下标,否则-1
public static int binarySearch(int[] arr,int left,int right,int findVal){
//当left》right结束,没有找到
if (left>right){
return -1;
}
int mid = (left+right)/2;
int midVal = arr[mid];
if (findVal>midVal){
//向右递归
return binarySearch(arr,mid+1,right,findVal);
}else if (findVal<midVal){
//左递归
return binarySearch(arr,left,mid-1,findVal);
}else {
return mid;
}
}
public static ArrayList<Integer> binarySearch2(int[] arr, int left, int right, int findVal){
//当left》right结束,没有找到
if (left>right){
return new ArrayList<>();
}
int mid = (left+right)/2;
int midVal = arr[mid];
if (findVal>midVal){
//向右递归
return binarySearch2(arr,mid+1,right,findVal);
}else if (findVal<midVal){
//左递归
return binarySearch2(arr,left,mid-1,findVal);
}else {
/**
* 找到mid索引值不要马上返回
* 向mid索引左边扫描,满足的元素下标加到list集合
* 向mid索引右边扫描,满足的元素下标加到list集合
* 将list返回
*/
ArrayList<Integer> list = new ArrayList<>();
int temp = mid-1;
while(true){
if (temp<0 || arr[temp]!=findVal){
break;
}
//否则temp放入list
list.add(temp);
temp -= 1;
}
list.add(mid); //中间的
//右扫描
temp = mid+1;
while (true){
if (temp>arr.length-1 || arr[temp]!=findVal){
break;
}
list.add(temp);
temp +=1;
}
return list;
}
}
}