折半查找的递归和非递归方法

折半查找,又称作二叉搜索,是面试时经常问到的算法问题,今天我们来看一下它的非递归和递归方法.

在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现:
1) 待查找数据值与中间元素值正好相等,则放回中间元素值的索引。
2) 待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值。
3) 待查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行1),直到找到相等的值
4) 如果最后找不到相等的值,则返回错误提示信息。

按照二叉树来理解:中间值为二叉树的根,前半部分为左子树,后半部分为右子树。折半查找法的查找次数正好为该值所在的层数。等概率情况下,约为log2(n+1)-1

  • 非递归方法
int BinTree(int Array[],int arrayLength,int key){
    int min = 0, max = arrayLength;
    int mid;
    while (min <= max) {
        mid = (min + max) / 2;
        if (key == Array[mid]) {
            return mid;
        }
        if (key < Array[mid]) {
            max = mid-1;
        }else if(key > Array[mid]){
            min = mid+1;
        }
    }
    return -1;
}
  • 递归方法
int BinTree(int Array[],int min,int max,int key){
    if(min <= max){
        int mid = (min + max) / 2;
        if (key == Array[mid]) {
            return mid;
        }else if(key < Array[mid]){
            return BinTree(Array, min, mid-1, key);
        }else if(key > Array[mid]){
            return BinTree(Array, mid+1, max, key);
        }
    }
    return -1;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,357评论 0 33
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,088评论 19 139
  • 原文出处:http://www.cnblogs.com/maybe2030/p/4715035.html引文出处:...
    明教de教主阅读 13,010评论 0 7
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,186评论 18 399
  • /*去重*/ function delRepeat(arr){ var newArray=new Array();...
    Hedgehog_Dove阅读 5,881评论 0 2

友情链接更多精彩内容