查找算法之二分查找

1. 概念

        二分查找(Binary Search)算法,也叫折半查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0。类似生活中猜字游戏,它的时间复杂度是O(logn),适用于经常查找的、但是不变的(增删)的有序列表。虽然查询效率很高,但也有一定的局限性,二分查找依赖顺序表结构,那么只能使用数组作为底层数据结构,数组按照下标随机访问数据的时间复杂度是O(1),而链表随机访问的时间复杂度是O(n),并且数据量太大和太小也不适合二分查找。

2.原理​​​

1)找出位于数组中间的值,并存放在一个变量中mid中,并和target进行比较
2)如果target值大于mid,则把数组中间位置作为下一次计算的起点进行比较。
3)如果target值小于mid,则把数组中间位置作为下一次计算的终点进行比较。
4)如果target值等于mid,则返回数组下标

3.算法分析

时间复杂度:O(logn)

4.参考链接

https://www.jianshu.com/p/78b505a6abf4

5.测试用例

public class BinarySearchDemo {


    /**
     * 普通版本 参考 Arrays.binarySearch0
     * @param a
     *@param fromIndex
     * @param toIndex
     * @param target
     * @return
     */
    private static int binarySearch0(int[] a, int fromIndex, int toIndex, int target) {
        int low = fromIndex;
        int high = toIndex - 1;
        while (low <= high) {
           // int mid = (low + high) >>> 1;
            //这种不容易内存溢出
            int mid = low + ((high - low) >> 1);
            int midVal = a[mid];
            if (midVal < target){
                low = mid + 1;
            }else if (midVal > target){
                high = mid - 1;
            }else{
                // key found
                return mid;
            }
        }
        // key not found.
        return -(low + 1);
    }




    /**
     * 递归实现
     * @param array
     * @param fromIndex
     * @param toIndex
     * @param target
     * @return
     * @throws Exception
     */
    public static int binarySearch(int[] array, int fromIndex, int toIndex, int target) {
        if (fromIndex <= toIndex) {
            int middle = (fromIndex + toIndex) >>> 1;
            if (array[middle] == target) {
                return middle;
            } else if (array[middle] < target) {
                return binarySearch(array, middle+1, toIndex, target);
            } else {
                return binarySearch(array, fromIndex, middle-1, target);
            }
        }
        return -1;
    }




    public static void main(String[] args) {
        int[] array=new int[]{2,3,4,5,6,7};
        int result = binarySearch(array,0,array.length,3);
        System.out.println(result);
    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值