Java语言之二分查找(折半查找)

查找过程

数组中的元素按升序排列,想要查找一个数是否在该数组中并输出该元素下标。

首先,先找到数组中的中间元素的下标,将数组分为左右两个表,把要查找的数与中间数作比较。若目标数和中间数相等,则目标数就是中间数,查找成功;若目标数比中间数小,则目标数在中间数左边的表中;若目标数比中间数大,则目标数在中间数右边的表中。然后,在确定的那一侧表中再找出中间数下标,进行上述比较,一直重复,直至找到目标数下标,或者没有子表可划分。

举例

arr数组元素:10,11,12,13,14,15,16,17,18,19,20
要找到17这个数字的下标:
第一轮折半:
先找出中间元素下标:(0+10)/2=5 ,将数组分为左右两个表
将arr[5]和17比较:arr[5]=15<17 , 说明17在中间元素15的右边
接下来在右边的表中折半查找。
第二轮折半:
先找出中间元素下标:(6+10)/2=8 ,将表分为左右两个表
将arr[8]和17比较:arr[8]=18>17 , 说明17在中间元素18的左边
接下来在左边的表中折半查找。
第三轮折半:
先找出中间元素下标:(6+7)/2=6 ,将表分为左右两个表
将arr[6]和17比较:arr[6]=16<17 , 说明17在中间元素16的右边
接下来在右边的表中折半查找。
第四轮折半:
先找出中间元素下标:(7+7)/2=7 ,将表分为左右两个表
将arr[7]和17比较:arr[7]=17=17
查找成功,下标为7。

 注意折半查找的数组必须是有序数组

Java代码

 public static void main(String[] args) {
        int[] arr={10,11,12,13,14,15,16,17,18,19,20};
        //找出arr数组中的17,返回下标(index)
        int index=arrayBinarySearch(arr,17);
        System.out.println(index==-1 ? "该元素不存在" : "该元素下标为:"+index);
    }

    /**
     * @param arr  被查找的数组(排过序的数组)
     * @param dest  目标元素
     * @return  -1:表示该元素不存在,其他:表示返回该元素下标
     */
    public static int arrayBinarySearch(int[] arr, int dest) {
        //开始元素下标
        int begin=0;
        //结束元素下标
        int end=arr.length-1;

        //只要begin在end左边,就一直循环;begin一旦大于end,就结束循环
        while (begin<=end){
            //中间元素下标
            int mid=(begin+end)/2;
            //如果中间元素等于目标元素,成功找到,返回下标mid
            if (arr[mid] == dest){
                return mid;
            }else if (arr[mid] < dest){
                //如果中间元素小于目标元素,说明目标元素在中间元素的右边
                //开始元素发生改变,结束元素不变
                begin=mid+1;
            }else {
                //如果中间元素大于目标元素,说明目标元素在中间元素的左边
                //结束元素发生改变,开始元素不变
                end=mid-1;
            }
        }
        //直到while循环结束都没找到,返回-1
        return -1;
        }

运行结果

该元素下标为:7

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值