【说明】:重点在于找到中间的那个值后,如果有重复的元素,需要以这个元素的位置分别向左边和右边遍历。将所有的值存在一个List集合中,然后返回,输出即可。没有找到就是-1.
package com.yang.search;
import java.util.ArrayList;
import java.util.List;
/**
* 二分查找:需要注意的是二分查找的前提是,有序的数组。
*/
public class BinarySearch {
public static void main(String[] args) {
//初始化数组
int[] arr={1,45,2,12,31,45,66,78,90,45};
List<Integer> index=binarySearch(arr,0,arr.length-1,45);
for (int i:index){
System.out.print(i+" ");
}
}
/**
* 查找的具体实现
* @param a:查找的数组
* @param left:查找的左边界
* @param right:查找的右边界
* @param value:查找的值
* @return 如果找到就返回元素的下表,否则返回-1
*/
public static List<Integer> binarySearch(int[] a,int left,int right,int value){
List<Integer> lists= new ArrayList<Integer>();
//没有找到时的条件
if(left>right){
System.out.print("没有找到:");
lists.add(-1);
return lists;
}
//找到数组的中间的一个值
int mid=(left+right)/2;
//比较a[mid]与value的大小
if(value>a[mid]) return binarySearch(a,mid+1,right,value); //向右递归
else if(value<a[mid]) return binarySearch(a,left,mid-1,value); //向左递归
else {
//遍历找到后的那个元素的左边是否有重复的元素
for(int i=0;i<mid-1;i++){
if(a[i]==a[mid])
lists.add(i);
}
lists.add(mid);
//遍历找到后的那个元素的右边是否有重复的那个元素
for(int j=mid+1;j<a.length;j++){
if(a[j]==a[mid])
lists.add(j);
}
return lists;
}
}
}