算法:二分搜索法

@

目录

    例如:

    int a[]= {1,2,3,4,5,6,7,8};
    

    一个数组,我们要从中找到5在其中的位置,最简单就是如下:

    
    for(int i=0;i<a.length;i++){
    	if(a[i]==5){
    		return i;
    	}
    }
    

    这种方法用大O表达法分析[1]的话,
    i=0;的频度为1
    i<a.length的频度为n; a.length的长度不是固定的
    if语句也执行了n次
    时间复杂度为:
    T(n)= 1+ 2*n;

    可以写为T(n)=O(n)

    使用二分搜索法的话:
    非递归实现

    public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int a[]= {1,2,3,4,5,6,7,8};
    		System.out.println(binarySearch(a, 7));
    		System.out.println(binarySearchp(a, 7,0,a.length-1));
    	}
    	/**
    	 * 非递归
    	 * @param a  需要查询的数组
    	 * @param x 需要查询的值
    	 * @return 数组中的索引
    	 */
    	public static int binarySearch(int a[],int x) {
    		int l=0,r=a.length-1;
    		while(l<=r) {
    			int m=(l+r)/2;
    			if(a[m]==x) {
    				return m;
    			}else if(a[m]>x) {
    				r=m-1;
    				
    			}else {
    				l=m+1;
    			}
    			
    		}
    		return -1;
    	}
    

    递归实现

    /**
    	 * 递归
    	 * @param a 数组
    	 * @param x 需要查询的值
    	 * @param l	左边的指针
    	 * @param r	右边的指针
    	 * @return	在数组中的索引
    	 */
    	public static int binarySearchp(int a[],int x,int l,int r) {
    			int m=(l+r)/2;
    			int res=0;
    			if(a[m]==x) {
    				return  m;
    			}else if(a[m]>x) {
    				return binarySearchp(a, x,l,m-1);
    			}else {
    				return binarySearchp(a, x,m+1,r);
    			}
    			
    	} 
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int a[]= {1,2,3,4,5,6,7,8};
    		System.out.println(binarySearch(a, 7));
    		System.out.println(binarySearchp(a, 7,0,a.length-1));
    	}
    

    用大O分析二分搜索的算法,可见每次执行一次算法的while循环,搜索数组减少一半,因此最坏情况被执行了O(logn)


    1. 大O表示法主要用来
      计算算法的时间复杂度 ↩︎

    原文地址:https://www.cnblogs.com/lzy321/p/10786744.html