package search;
import java.util.ArrayList;
import java.util.List;
/**
* Created by guipengfei on 2020/8/28 15:45
*
* 1.binarySearch1采用递归形式实现二分查找
* 2.binarySearch2也采用递归形式实现二分查找,但是对bianrySearch1做出了改进,可以查找出所有相同的元素
* 3.binarySearch3采用的是非递归形式实现的二分查找
*/
public class BinarySearch {
public static void main(String args[])
{
int arr1[] = {
1, 8, 10, 89,1000, 1234 };
System.out.println(binarySearch1(arr1,0,arr1.length-1,10));
int arr2[] = {
1, 8, 10, 89,1000,1000,1000, 1234 };
System.out.println(binarySearch2(arr2,0,arr2.length-1,1000));
System.out.println(binarySearch3(arr1,0,arr1.length-1,10));
}
public static int binarySearch1(int arr[],int left,int right,int keyVal)
{
if(left>right)
return -1;
int mid=(left+right)/2;
if(keyVal>arr[mid])
return binarySearch1(arr,mid+1,right,keyVal);
else if(keyVal<arr[mid])
return binarySearch1(arr,left,mid-1,keyVal);
else
return mid;
}
public static List<Integer> binarySearch2(int arr[],int left,int right,int keyVal)
{
if(left>right)
return new ArrayList<Integer>();//没有找到则返回一个空集合
int mid=(left+right)/2;
if(keyVal>arr[mid])
return binarySearch2(arr,mid+1,right,keyVal);
else if(keyVal<arr[mid])
return binarySearch2(arr,left,mid-1,keyVal);
else {
List<Integer> resIndexlist = new ArrayList<Integer>();
int temp=mid-1;
while (true)
{
if(temp<0||arr[temp]!=arr[mid])
break;
resIndexlist.add(temp);
temp--;
}
resIndexlist.add(mid);
temp=mid+1;
while (true)
{
if(temp>arr.length-1||arr[temp]!=arr[mid])
break;
resIndexlist.add(temp);
temp++;
}
return resIndexlist;
}
}
public static int binarySearch3(int arr[],int left,int right,int keyVal)
{
int res=-1;
while (true)
{
if(left>right)
break;
int mid=(left+right)/2;
if(keyVal>arr[mid])
left=mid+1;
else if(keyVal<arr[mid])
right=mid-1;
else
{
res=mid;
break;
}
}
return res;
}
}
Several forms of binary search
Guess you like
Origin blog.csdn.net/qq_43478694/article/details/108281660
Recommended
Ranking