二分查找实现-Java

 代码中有两种方法:

        ①使用循环实现

        ②使用递归实现

两种方法有什么异同呢?

在这个特定的二分查找算法中,使用循环和递归两种实现方式的时间复杂度是相同的,都是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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值