经典算法-折半查找法

185 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

问题描述

在排好序的数组中查找某个数,如果找到返回所在的位置,不存在返回-1

解题思路

对于排好序的数组,我们没必要从头找到尾,因为从头找到尾的平均时间复杂度为O(N/2)。

可以将数组从中间一分为2,如果走运,中间的数值正好等于要找的数,那就结束。如果发现中间这个数大于我们要找的数,那右半边的数,我们就没必要去比较了,可以扔掉不管。我们再将左边的数从中间拆开,和要找的数比较,这样每做一次比较,就扔掉一半的数据,显然这种方法大大地减少了比较次数,运气最差时,经过log2N次比较,就能够确定数的位置。

使用递归的代码

public class HalfSearch {


    public static  void main(String[] args){

        int[] arr = {1,4,6,8,9,10,22,29};
        int n=30;
        HalfSearch halfSearch = new HalfSearch();
        int position = halfSearch.getPosition(arr,n,0,arr.length-1);
        System.out.println(position);

    }

    public  int getPosition(int[] arr,int n,int start,int end){
        
        if(end<start){
          return -1;
        }
        int position =(start+end)/2;
        if(arr[position]==n){
            return position;
        }
        else if(n>arr[position]){
           return getPosition(arr,n,position+1,end);
        }
        else{
            return  getPosition(arr,n,start,position-1);
        }

    }
}

总结

算法这个东西,有的时候就像数学公式,多写多练,遇到问题,就可以套用了。