相关代码
二分法查找
//二分查找(折半查找)
//要求数组是个有序数组
public class BinarySearch {
public static void main(String[] args) {
int[] arr={1,2,5,7,8,9,10,10,18,20};
int left=0;
int right=arr.length-1;
int res=binarySearch(arr, 10,right,left);
if(res==-1){
System.out.println("没找到!");
}else{
System.out.println("找到了,下标是"+res);
}
}
public static int binarySearch(int[] arr,int value,int right,int left){
if(right
return -1;
}
int mid=(right+left)/2;
if(arr[mid]>value){
return binarySearch(arr,value,mid-1,left);
}else if(arr[mid]
return binarySearch(arr,value,right,mid+1);
}else{
return mid;
}
}
}
这个数组第6位是10,第7位也是10,返回的是下标7。
这是因为第7位先被找到,所以就直接被返回了。出入金流程
如果想让你查找数字在数组中的位数都返回,比如上面这条代码查找10,返回 6 ,7。那么请看下面代码。
二分法的功能完善
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
//二分查找的优化
public class BinarySearch2 {
public static void main(String[] args) {
int[] arr={1,2,5,5,5,5,6,8};
System.out.println("请输入你想查找的值");
Scanner scanner=new Scanner(System.in);
int value=scanner.nextInt();
int left=0;
int right=arr.length-1;
List reaList=binarySearch2(arr,value,left,right);
System.out.println(reaList);
}
public static List binarySearch2(int[] arr,int value,int left,int right){
//如果找不到,返回一个空的ArrayList
if(right
return new ArrayList();
}
int mid=(left+right)/2;
if(arr[mid]>value){
return binarySearch2(arr,value,left,mid-1);
}else if(arr[mid]
return binarySearch2(arr,value,mid+1,right);
}else{
List resList=new ArrayList();
//先找左边的
int temp=mid-1;
while (true){
if(temp<0||arr[temp]!=value){
break;
}
resList.add(temp);
temp--;
}
//把中间的mid放进去
resList.add(mid);
//开始找右边
temp=mid+1;
while(true){
if(temp>right||arr[temp]!=value){
break;
}
resList.add(temp);
temp++;
}
return resList;
}
}
}