JAVA版本:使用二分法查找数组中的数据

使用二分法查找数组中的数据:
分析:二分法查找适用于数据量较大时,但是数据需要先排好顺序。
主要思想是:(设查找的数组区间为array[low, high])
(1)确定该区间的中间位置K(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。
时间复杂度
1.最坏情况查找最后一个元素(或者第一个元素)Master定理T(n)=T(n/2)+O(1)所以T(n)=O(log2n)
2.最好情况查找中间元素O(1)查找的元素即为中间元素(奇数长度数列的正中间,偶数长度数列的中间靠左的元素)

public static void main(String[] args) {
        //定义一个数组
        int []arr={2,8,74,687,9,4,7,687,456,3214674,68,4852};
        //二分法查找必须是有序数组,否则无法完成二分法查找
        //先给数组进行排序
         Arrays.sort(arr);
         //遍历数组,为了试验结果
        System.out.println(Arrays.toString(arr));
         //调用方法,查询需要值
       ArrayDichotomy(arr,4852);
    }
    //使用二分法查找数组中的数据,并返回数据在数组中的位置(数组下标)
    public static void ArrayDichotomy(int arr[],int number){
        //定义查询范围的最小值,第一个查询数应该是从零开始
        int min=0;
        //定义查询范围的最大值,第一次查询应该是数组的长度
        int max=arr.length-1;
        //定义查询数据所在的位置,用来二分计数,二分计算应该是最大值加上最小值的和除以2
        int mid=(max+min)/2;
        //开始循环查找,没有查找的需要的值,就一直循环直到查找到数据为止
        while (arr[mid]!=number){
            //二分判断,如果需要查找的数字,大于数组中间数,则结果值应该在数组的后半段,反而反之
            if (number>arr[mid]) {
                //如果在后半段,则移动最小值到当前的中间数的后一位
                min=mid+1;
            }
            //如果查询数小于中间数,则在前半段
            if (number<arr[mid]) {
                //在前半段,则移动最大数到中间值的前一位
                max=mid-1;
            }
            //当中间值超越了数组下标范围时,则查无此数
            if (mid <=0 || mid>=arr.length) {
                //查不到数,则结束循环
                System.out.println("查无此数!");
                //退出程序
                return;
            }
            //重新计算中间数,进入下一次循环
            mid=(mid+max)/2;
        }
        //如果查询的数据结束后,还在数组范围内,输出需要查找数据的下标
        if (mid >=0 && mid <=arr.length) {
            System.out.println("你查询的数"+number+"是数组中的第"+(mid+1)+"个数");
            return;
        }
        //超出数组,查无此数
        System.out.println("查无此数!");;
    }

运行结果,能查询的样子:
在这里插入图片描述
查无此数时:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值