折半查找的两种实现方式

折半查找的前提是:待排数组必须有序

第一种方式:在判断条件中直接改low/high的值

    public static void main(String[] args) {
        int arr[] = {4,9,15,21,25,36,39,45};
        System.out.print("输入要查找的数值:");
        Scanner sc =new Scanner(System.in);
        int key = sc.nextInt();
        zbsearch(arr,key);
    }
    public static void zbsearch(int[] arr,int key)
    {
        int low=0;
        int high=arr.length-1;
        while(low<=high) {       //如果low大于high则说明没有继续折半的必要了
            int mid=(low+high)/2;
            if (arr[mid] == key) {
                System.out.println("已找到,位置是:" + mid);
                return;
            } else if (arr[mid] > key)
                high = mid - 1; //如果key<中间的数值,则应该从中间位置的左边再进行查找
            else
                low = mid + 1;//如果key>中间的数值,则应该从中间位置的右边再进行查找
        }
        System.out.println("不存在");
    }

第二种方式:递归函数实现

public static void main(String[] args) {
        int arr[] = {4,9,15,21,25,36,39,45};
        System.out.print("输入要查找的数值:");
        Scanner sc =new Scanner(System.in);
        int key = sc.nextInt();
        halfsearch(arr,key,0,arr.length-1);
    }    
public static void halfsearch(int[] arr, int key, int low, int high) {
        if (low <= high)//如果low大于high则说明没有继续折半的必要了
        {
            int mid = (low + high) / 2;
            if (key == arr[mid]) {
                System.out.println("已找到,位置是:" + mid);
                return;
            } else if (key < arr[mid])
                /*
                如果key<中间的数值,则应该从中间位置的左边再进行查找
                而且low的值不能设置为0,因为如果查找的路径是先key的右边
                然后key的左边则会导致所要查找的范围增大会出现mid的值计算不准确从而导致报错
                因此在进行递归是low所传进去的参数还是low
                */
                halfsearch(arr, key, low, mid - 1);
            else
                /*
                如果key>中间的数值,则应该从中间位置的左边再进行查找
                而且high的值不能设置为arr.length-1,因为如果查找的路径是先key的左边
                然后key的右边则会导致所要查找的范围增大会出现mid的值计算不准确从而导致报错
                因此在进行递归是high所传进去的参数还是high
                */
                halfsearch(arr, key, mid + 1, high);
        } else
            System.out.println("不存在");
        return;
    }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值