java 实现的二分查找算法

一、定义:

二分法查找,也称折半查找(Binary Search),是一种在有序数组中查找特定元素的算法。是效率较高的查找方法之一。

二、实现思路:

(1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则结束执行,返回该中间元素的索引,否则执行下一步。
(2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。
(3)如果找不到目标元素,返回-1。因为数组的索引从0开始。返回的是负数都可。

三、要求:

必须采用顺序存储结构。

四、 适用场景:

适用于数据量较大时,但是数据需要先排好顺序。

五、复杂度分析:

时间复杂度

1.最坏情况查找最后一个元素的情况(或者第一个元素; T(n)=T(n/2)+O(1)所以T(n)=O(log2n);
2.最好情况查找中间元素O(1)查找的元素即为中间元素的情况(奇数长度数列的正中间,偶数长度数列的中间靠左的元素);

空间复杂度

S(n)=logn

六、代码实现:

非递归:

/**
 * 非递归
 * @param arr 有序的列表
 * @param number
 * @return
 */
public static  int noRecursive(int [] arr,int number){
    int start = 0;
    int end = arr.length-1;
    while(start <= end){
        int mid = (start + end)/2;
        if(arr[mid] == number) {
            return mid;
        }
        else if(arr[mid] > number){
            end = mid -1;
        }else if(arr[mid] < number){
            start = mid + 1;
        }
    }
    return -1;
}

递归:

public static  int recursive(int left,int right,int [] arr,int number){
        int mid = (left + right)/2;
        if(left > right){
            return -1;
        }
        if(arr[mid] == number) {
            return mid;
        }
        else if(arr[mid] > number){
            return recursive(left,mid-1,arr,number);
        }else if(arr[mid] < number){
            return recursive(mid + 1,right,arr,number);
        }
        return -1;
    }

捎带介绍一下实现此递归的思路:

1. 明确函数的功能是什么;
2. 明确函数结束的条件;
3. 找出函数的等价关系式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值