二分查找算法

二分查找算法(也称为折半查找算法)效率相对较高,是一种在有序数组中查找某一特定元素的搜索算法。(来源:wikipedia

步骤:

第一步:从数组的中间元素开始查找,如果数组中的中间元素等于要查找的元素,查找结束;

第二步:如果要查找的元素大于或者小于数组的中间元素,则在数组大于或小于中间元素的那一半中查找,和步骤一同样从中间元素开始查找;

第三步:如果数组为空,则代表找不到;

折半查找算法每次把搜索范围缩小一半,时间复杂度为: log(n)

二分查找需要注意的问题(何登成的技术博客

一、检查参数的有效性

例如:low和high是否相同、数组中是否存在元素、low和high构成的数组是否有效等,代码的鲁棒性要强

二、二分查找中值的计算

常规算法:  mid = (low + high)/ 2

试想一种极端的情况,low = 2147483640 , high = 10 , 则算出来的 mid 肯定是一个错误答案 ;

上面的表达式可以转化成:    mid = ( (high - low + low + low)  / 2 = low + ( high - low ) / 2

这样就可以避免 (low + high) 溢出的情况

同时 mid = low + ( high - low ) / 2 得出的结果更合期望的一致,向下取整

三、从效率来看,一般不采用递归形式实现二分查找算法

下面给出算法的两种实现方法(循环实现和递归实现):

循环实现代码:

#import <Foundation/Foundation.h>
int main(int argc , const char * argv[])  {
    int array[] = {0,1,2,3,4,5,6,7,8,9,10} ;
    int count = sizeof(array) / sizeof(array[0]) ;
    int target = 4 ;
    int low = 0 , high = count - 1 , mid = 0 ;
    while(low <= high)  {
        mid = low + (high - low) / 2 ;
        if(array[mid] > target)
            high = mid - 1 ;
        else if(array[mid] < target)
            low = mid + 1 ;
        else
            break ;
    }
    if(low <= high)
        NSLog(@"%d",mid) ;
    else
        NSLog(@"NO") ;
    return 0 ;
}

递归实现代码:

#import <Foundation/Foundation.h>

int BinarySearch(int array[] , int low , int high , int target)   {
    if(low > high)
        return -1 ;
    int mid = low + (high - low) / 2 ;
    if(array[mid] > target)
        BinarySearch(array , low , mid - 1 , target) ;
    else if(array[mid] < target)
        BinarySearch(array , mid + 1 , high , target) ;
    else
        return mid ;
}

int main(int argc , const char * argv[])  {
    int array[] = {0,1,2,3,4,5,6,7,8,9,10} ;
    int temp = BinarySearch(array , 0 , 10 , 4) ;
    if(temp != -1)
        NSLog(@"%d",temp) ;
    else
        NSLog(@"NO") ;
    return 0 ;
}
原文地址:https://www.cnblogs.com/scottdinggo/p/4419958.html