二分查找(递归与非递归)

思路:

  1. 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找
  2. 二分查找法的运行时间为对数时间 O(㏒₂n) ,即查找到需要的目标位置最多只需要㏒₂n 步,假设从[0,99]的
    队列(100 个数,即 n=100)中寻到目标数 30,则需要查找步数为㏒₂100, 即最多需要查找 7 次(26<100<27)

递归实现

二分查找(递归与非递归)_递归


注意二分查找只能用于有序的数组,无序的不能使用二分查找算法

具体实现如下:

//查找单值的二分查找
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; //返回这个集合
}
}

非递归实现

public class BinarySearchNoRecur {

public static void main(String[] args) {
int[] arr={1,3,8,10,11,67,100};

int index=binarySearch(arr,100);

System.out.println("index="+index);
}


/**
* 二分查找的非递归实现
* @param arr 待查找的数组,arr 是升序排序
* @param target 需要查找的数
* @return 返回对应下标,-1 表示没有找到
*/
public static int binarySearch(int[]arr,int target){
int left=0;
int right=arr.length-1;
while (left<=right){
//说明继续查找
int mid=(left+right)/2;

if (arr[mid]==target){
return mid;
}else if (arr[mid]>target){
//需要向左边查找
right=mid-1;
}else {
//需要向右边查找
left=mid+1;
}
}
return -1;
}
}

二分查找(递归与非递归)_二分查找_02