算法- >二分查找

73 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

背景

当我们要从一个序列中查找一个元素的时候,最快想到的方法就是顺序查找法(即:从前到后依次查找)。但这种方法过于无脑,就是暴力的把每个元素都排查一遍。元素个数少的时候还行,一旦元素个数多起来,效率是非常低下,所以在实际中这种查找的方法是被摒弃的。

这里就不得不介绍一种简单且效率较高的查找方法了:二分查找法,又称折半查找法。

基本思路

该方法是建立在有序的前提下的,基本思路就是:

  • 先找到那个有序序列的中间元素mid,然后拿它和要找的元素K进行比较,就可以初步判断K所在范围,既然查找范围已确定,自然该范围之外的元素就可以不用再查找了

代码实现

/**
* 参数依次是:数组,目标值,起始位置,结束位置.
*/
public static  int  binarySearch(int[] arr, int num, int start, int end){
    //获取最中间的值
    int mid = (end-start )/2+start;
	  //校验中间值是否就是目标值,不是则继续截取数组。
    if (arr[mid]==num) {
        return mid;
    }
    //校验参数合法性
    if (start>=num) {return -1;}

    if (num<arr[mid]){  //判断目标值 小于 则从起始位置到 中间位置继续递归
       return     binarySearch(arr,num,start,mid-1);
    }
    if (num>arr[mid]){ //判断目标值 大于 则从中间位置到 结束位置继续递归
       return     binarySearch(arr,num,mid+1,end);
   }

    return -1;
}
public static void main(String[] args) {
    int[] arr = {1,3,5,7,9,11,17,89,82,91,100,101,137,301};

    int i = BinarySearchTest.binarySearch(arr, 7, 0, arr.length-1);
    System.out.println(i);
}

时间复杂度

我们用二分查找法查找数据时,查找一次后可以筛去一半的数据,经过一次次的筛选,最后会使得待查数据只剩一个,那么我们查找的次数就是while循环执行的次数。
因为数据个数为N,一次查找筛去一半的数据,即还剩N/2个数据,经过一次次的筛选,数据最后剩下1个,那么查找的次数可以理解为N除以若干个2,最后得1,那么while循环执行的次数就是N除以2的次数,我们只需计算N除以了多少次2最终等于1即可。
最后二分查找函数的时间复杂度为:k=log2n,(是以2为底,n的对数)