zoukankan      html  css  js  c++  java
  • 二分查找算法

    二分查找算法(也称为折半查找算法)效率相对较高,是一种在有序数组中查找某一特定元素的搜索算法。(来源: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 ;
    }
  • 相关阅读:
    PL/SQL用户指南与参考PL/SQL应用程序性能调优(转)
    SQL Server 查看数据库基本信息
    对于风雨,逃避它,还是迎向它?
    Android学习之路八:Menu
    Android学习之路二:Button,ImageButton和ToggleButton
    Android学习之路五:Dialog和Toast
    Android学习之路七:DatePicker和TimePicker
    Android学习之路四:ImageView
    Android学习之路三:CheckBox和RadioButton
    Android学习之路一:TextView和EditView
  • 原文地址:https://www.cnblogs.com/scottdinggo/p/4419958.html
Copyright © 2011-2022 走看看