Java实现二分查找

public class BinarySearch {

    /**
     * 二分查找-非递归
     * @param 整数顺序数组
     * @param 目标数字
     * @return 如果存在则返回元素所在下标,不存在则返回-1
     */
    public static int search1(int[] arr, int num) {

        int min = 0; //最小下标
        int max = arr.length - 1; //最大下标
        if(num < arr[min] || num > arr[max]) { //先判断num是否在arr下标范围内,不在则返回-1
            return -1;
        }
        while(min <= max) { //用while循环逐次对半缩小查找区间间
            //范围最后缩小到只有两个数或一个数时,直接判断,防止所查数字不在数组中而出现死循环
            if(min == max-1 || min == max) {
                if(arr[min] == num)
                    return min;
                else if(arr[max] == num)
                    return max;
                else
                    return -1;
            }

            int middle = (min + max)/2; //定义区间中间元素下标
            if(arr[middle] == num) { //当中间元素和num相等时返回
                return middle;
            } else if (arr[middle] < num) { //num比中间元素大,则去后半段middle-max查找
                min = middle;
            } else { //num比中间元素小,则去前半段min-middle查找
                max = middle;
            }

        }

        return -1;//如果没查到则返回-1
    }

    /**
     * 二分查找-递归
     * @param arr 整数顺序数组
     * @param num 目标数字
     * @param min 区间最小下标
     * @param max 区间最大下标
     * @return 如果存在则返回元素所在下标,不存在则返回-1
     */
    public static int search2(int[] arr, int num, int min, int max) {
        if(min == max-1 || min == max) {
            if(arr[min] == num)
                return min;
            else if(arr[max] == num)
                return max;
            else
                return -1;
        }
        int middle = (min + max)/2;
        if(num < arr[min] || num > arr[max]) {
            return -1;
        }
        if(num == arr[middle]) {
            return middle;
        } else if (num < arr[middle]) {
            return search2(arr,num,min,middle);
        } else {
            return search2(arr,num,middle,max);
        }
    }

    public static void main(String[] args) {
        //测试非递归
        int[] arr = {1,3,5,7,8,10,12};
        int index = search1(arr, 7);
        if(index == -1)
            System.out.println("所查数组无此元素!");
        else
            System.out.println("元素下标为:" + index);

        //测试递归
        index = search2(arr, 6, 0, arr.length-1);
        if(index == -1)
            System.out.println("所查数组无此元素!");
        else
            System.out.println("元素下标为:" + index);
    }

}

需要注意的地方在于最后一次二分后,查找范围缩减为1~2个数,这时候需要直接去比较是否有想要查的数;如果不添加判断,当数组元素没有所查的数时,会出现重复最后一次二分无限判断的死循环;测试结果:
元素下标为:3
所查数组无此元素!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值