首页 > 其他 > 详细

二分查找

时间:2017-01-08 17:39:40      阅读:503      评论:0      收藏:0      [点我收藏+]

二分查找,又叫折半查找,是一种在有序数组(以及其它线性存储结构)中查找一个元素的高效算法。最坏时间复杂度为   O(logn)

算法思想

1、让L = 0 , H  = len-1
2、如果L>H,则查找以失败结束
3、让mid 为  不大于 (L+H) /2 的整数,即 mid = floor((L+H)/2)
4、如果arr[mid]<T ,则 让 L = mid +1,继续第二步
     如果arr[mid]>T 则让H = mid - 1,继续第二步
     如果arr[mid]==T,则查找成功,mid就是T在数组arr中的index,返回mid。
 
 
技术分享

注意事项

①使用的前提是数组有序
②如果数组中有重复元素,当需要查找的元素恰好是重复元素时,返回的索引是这些重复元素中哪个的索引值是不确定。这需要注意的。如下查找元素3。
            [1,2,3,3,7]      返回的是第一个3的index
            [1,3,3,7,8]      返回的是最后一个3的index
            [1,3,3,3,7]      返回的是中间一个3的index
 
 

代码实现

public static int binarySearch(int[] arr,int target)
{
        int low = 0;
        int high = arr.length - 1;
        int mid=-1;
        
        while (low <= high)
        {
            mid = (high-low)/2 + low ;    //使用 (low+high) /2 可能会溢出。对于java,使用 mid =  (high+low)>>>1; 也可以防止溢出
            

            if (arr[mid] < target)
                low = mid + 1;
            else if (arr[mid] > target)
                high = mid - 1;
            
            else   //arr[mid] == target
                return mid; //  found
        }
        return -1; // not found.

}

 

对于时间复杂度的分析

为什么时间复杂度最坏为   O(logn)呢? (注意:计算机科学中, log 默认都是以2为底的)
最坏的情况为:我们去查找数组中的最后一个元素(或者第一个元素),因为他们都最偏离中间,需要不断折半,直到最后折半后的数组只剩下一个元素。
假设这个数组长度为 n   ,且假设 2 = n ;那么 让n 递归的除以2,需要x次,才能近视为1。x即为时间需要循环的次数。
x = logn
 
 
 
 

二分查找

原文:http://www.cnblogs.com/lulipro/p/6262248.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!