算法-二分查找

2 篇文章 0 订阅

二分查找

简介

二分查找(binary search)又叫折半查找,要求数据序列呈线性结构(排过序的数据序列)。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

功能实现

递归

public static int binarySearch(int[] arr, int start, int end, int hkey){
    if (start > end)
        return -1;

    int mid = start + (end - start)/2;    //防止溢位
    if (arr[mid] > hkey)
        return binarySearch(arr, start, mid - 1, hkey);
    if (arr[mid] < hkey)
        return binarySearch(arr, mid + 1, end, hkey);
    return mid;  

}

while循环

public static int binarySearch(int[] arr, int start, int end, int hkey){
    int result = -1;

    while (start <= end){
        int mid = start + (end - start)/2;    //防止溢位
        if (arr[mid] > hkey)
            end = mid - 1;
        else if (arr[mid] < hkey)
            start = mid + 1;
        else {
            result = mid ;  
            break;
        }
    }

    return result;

}

完整代码

取中间值使用:start + (end - start)/2; 可以有效防止数组下标溢出。

public static void main(String[] args) {
        //需要查找的数字
        int target = 45;
        //线性数组
        int[] num = {1, 4, 7, 11, 15, 23, 34, 45, 46, 77};
        //开始元素序号,中间元素序号,末尾元素序号
        int low = 0, mid, high = num.length - 1;
        //目标索引位置
        int targetIndex = -1;
        while (low <= high) {
            //获取中间元素序号
            //mid = (low + high) / 2; 当数组极大时,(low + high)的值可能为负数,造成数组下标溢出
            mid = low + (high - low) / 2;
            //判读中间元素是否等于目标数字
            if (num[mid] == target) {
                targetIndex = mid;
                break;
            } else if (num[mid] > target) {//中间元素是否大于目标数字
                //末尾元素序号重新赋值为mid-1
                //low...target...mid...high ==> low...target..high(mid...high)
                high = mid - 1;
            } else {//中间元素是否小于目标数字
                //开始元素序号重新赋值为mid+1
                //low...mid...target...high ==> (low...mid)low..target...high
                low = mid + 1;
            }
        }

        if (targetIndex == -1) {
            System.out.println("目标不存在");
        } else {
            System.out.println("目标索引是:" + targetIndex);
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值