二分查找
二分查找
思路:

注意二分查找只能用于有序的数组,无序的不能使用二分查找算法
具体实现如下:
//查找单值的二分查找
public static int binarySearch(int [] arr,int left,int right,int findval)
{
//如果左边的大于右边的说明没有找到
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)
{
//如果左边的大于右边的说明没有找到
if (left>right)
{
return new ArrayList<Integer>();//返回一个空的集合
}
//找到中间的数
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
{
ArrayList<Integer> arry=new ArrayList<>();//创建存储的集合
int temp=mid-1; //左边找
while (true)
{
if (temp<0||arr[temp]!=findval) //说明找到尽头
{
break;
}
arry.add(temp); //添加进去
temp-=1;
}
arry.add(mid);//添加中间的数进去
temp=mid+1; //右递归寻找
while (true)
{
if (temp>arr.length-1||arr[temp]!=findval) //说明已经没有了
{
break;
}
arry.add(temp); //添加进去
temp+=1;
}
return arry; //返回这个集合
}
}


浙公网安备 33010602011771号