相关代码

二分法查找

//二分查找(折半查找)

//要求数组是个有序数组

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;

}

}

}