代码中有两种方法:
①使用循环实现
②使用递归实现
两种方法有什么异同呢?
在这个特定的二分查找算法中,使用循环和递归两种实现方式的时间复杂度是相同的,都是O(log n)。
使用循环的实现方式通常被认为是更优的选择,因为它避免了递归的函数调用开销,节省了额外的栈空间。此外,循环实现方式还更容易理解和调试。
虽然递归实现方式可能更简洁和直观,但在大规模数据集上,递归的函数调用会导致栈溢出的风险,并且可能在性能方面略逊于循环实现方式。
因此,在大多数情况下,使用循环实现的二分查找算法更受推荐。
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class Main {
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
System.out.println("Please enter the number of date:");
int nums=sc.nextInt();
System.out.println("Please enter data separated by Spaces:");
int[] arr=new int[nums];
Random random=new Random();
for(int i=0;i<nums;i++){
arr[i]= random.nextInt(0,100);
}
int aim=arr[4];
System.out.println("aim->"+aim);
Arrays.sort(arr);//由于二分查找的查找机制,所以我们需要将数据排序后在进行二分查找
System.out.println(Arrays.toString(arr));
// System.out.println("Please enter the data you are looking for:");
// int aim=sc.nextInt();
int res=search(arr,0,arr.length-1,aim);
System.out.println("递归:"+res);
int res1=binarySearch(arr,aim);
System.out.println("循环:"+res1);
}
public static int search(int[] arr,int left,int right,int aim){//使用递归实现算法
int index=-1;
if(left>right)return index;
int mid=(left+right)/2;
if(aim<arr[mid]){
return search(arr,left,mid-1,aim);
}else if(aim>arr[mid]){
return search(arr,mid+1,right,aim);
}else{
return mid;
}
}
public static int binarySearch(int[] arr,int aim){//使用循环实现算法
int i=0;
int j=arr.length-1;
while(i<=j){
int mid=(i+j)/2;
if(aim<arr[mid]){
j=mid-1;
} else if(aim>arr[mid]){
i=mid+1;
}else{
return mid;
}
}
return -1;
}
}