二分查找
二分查找的思路
- 首先确定该数组的中间的下标
mid=(left+right)/2
- 然后让需要查找的数Findvalue和arr[mid]进行比较
2.1) Findvalue > arr[mid],说明你要查找的数据在mid的右边,需要向右递归查找。
2.2) Findvalue < arr[mid],说明你要查找的数据在mid的左边,需要向左递归查找。
2.3) Findvalue==arr[mid],表明找到,就可以选择返回。 - 结束递归。当我们递归完整个数组,仍然没有找到Findvalue(即 :left>right),就需要退出。
无重复数据的有序数组
数组如下:{1,3,6,10,32,34,54,67,78,100},要求查找出给出数值Findvalue的下标。
可以直接返回一个int,其中 -1 表示没有找到。
具体代码
//main方法中代码
int arr[]= {1,3,6,10,32,34,54,67,78,100};
int result=binarySearch(arr, 0, arr.length-1, 3);
System.out.println("下标为: "+result);
/**
*有序且无重复的数组中查找
* @param arr 给定的数组
* @param left 最小下标
* @param right 最大下标
* @param Findvalue 要找的值
* @return 值对应的下标,没有就返回-1
*/
public static int binarySearch(int arr[],int left,int right,int Findvalue) {
int mid=(left+right)/2;
//在递归中,表明递归了整个数组,没有找到该数据
if(left>right) {
return -1;
}
if(Findvalue>arr[mid]){ //向右递归
return binarySearch(arr,mid+1,right,Findvalue);
}else if(Findvalue<arr[mid]){ //向左递归
return binarySearch(arr,left,mid-1,Findvalue);
}else{
//找到返回下标
return mid;
}
}
运行结果图
有重复数据的有序数组
数组如下:{1,3,6,10,10,10,32,34,54,67,78,100},要求查找出所有符合Findvalue的数值的下标。
将查找出来的数据存放到集合list中,返回一个list,没有就返回[ ]
具体代码
//main方法中代码
int arr1[]= {1,3,6,10,10,10,32,34,54,67,78,100};
List<Integer> result1=binarySearch2(arr1, 0, arr1.length-1, 10);
System.out.println("下标为: "+result1);
/**
*有重复的数据,将所有符合的数据都输出出来
* @param arr 给定的数组
* @param left 最小下标
* @param right 最大下标
* @param Findvalue 要找的值
* @return
*/
public static List<Integer> binarySearch2(int arr[],int left,int right,int Findvalue) {
int mid=(left+right)/2;
//在递归中,表明递归了整个数组,没有找到该数据
if(left>right) {
return new ArrayList<Integer>();
}
if(Findvalue>arr[mid]){ //向右递归
return binarySearch2(arr,mid+1,right,Findvalue);
}else if(Findvalue<arr[mid]){ //向左递归
return binarySearch2(arr,left,mid-1,Findvalue);
}else{ //表明是在中间找到了
//用于存放数据
List<Integer> resultIndex=new ArrayList<Integer>();
//将先前找到的值加入到集合中
resultIndex.add(mid);
//向mid索引值得左边扫描,判断是否存在满足条件的值。
int temp=mid-1;
while(true) {
if(temp<0 || arr[temp]!=Findvalue) {
break;
}
resultIndex.add(temp);
temp-=1;
}
//向mid索引值得右边扫描,判断是否存在满足条件的值。
int temp1=mid+1;
while(true) {
if(temp1>arr.length-1 || arr[temp1]!=Findvalue) {
break;
}
resultIndex.add(temp1);
temp1+=1;
}
return resultIndex;
}
}