javascript折半查找详解


Posted in Javascript onJanuary 26, 2015

折半查找法

在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现:

1)     待查找数据值与中间元素值正好相等,则放回中间元素值的索引。

2)     待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值。

3)     待查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行1),直到找到相等的值

4)     如果最后找不到相等的值,则返回错误提示信息。

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

log2(n+1)-1

//Data为要查找的数组,x为待查找数据值,beg为查找范围起始,last为查找范围终止  

//非递归法  

int BiSearch(int data[], const int x, int beg, int last)  

{  

    int mid;//中间位置  

    if (beg > last)  

    {  

        return -1;  

    }  

    while(beg <= last)  

    {  

        mid = (beg + last) / 2;  

        if (x == data[mid] )  

        {  

            return mid;  

        }  

        else if (data[mid] < x)  

        {  

            beg = mid + 1;  

        }  

        else if (data[mid] > x)  

        {  

            last = mid - 1;  

        }  

    }  

    return -1;  

}  

//递归法  

int IterBiSearch(int data[], const int x, int beg, int last)  

{  

    int mid = -1;  

    mid = (beg + last) / 2;  

    if (x == data[mid])  

    {  

        return mid;  

    }  

    else if (x < data[mid])  

    {  

        return IterBiSearch(data, x, beg, mid - 1);  

    }  

    else if (x > data[mid])  

    {  

        return IterBiSearch(data, x, mid + 1, last);  

    }  

    return -1;  

}  

//主函数  

int _tmain(int argc, _TCHAR* argv[])  

{  

    int data1[60] = {0};  

    int no2search = 45;  

    cout << "The array is : " << endl;  

    int siz = sizeof(data1)/sizeof(int);  

    for (int i = 0; i < siz; i++)  

    {  

        data1[i] = i;  

        cout << data1[i] << " ";  

    }  

    cout << endl;  

    int index = -1;  

    //index = BiSearch(data1, no2search, 0, siz);  

    index = IterBiSearch(data1, no2search, 0, siz);  

    cout << "Index of " << no2search << " is " << index << endl;  

    getchar();  

    return 0;  

} 
/**

  * 折半查找字符在数组中的位置(有序列表)

  * @param array 被检索的数组

  * @param x  要查找的字符

  * @returns 字符在数组中的位置,没找到返回-1  

  */  

function binarySearch(array,x){ 

  var lowPoint=1;                     

 var higPoint=array.length;

 var returnValue=-1;                

 var midPoint;

 var found=false;                   

 while ((lowPoint<=higPoint)&&(!found)){

  midPoint=Math.ceil((lowPoint+higPoint)/2); 

  //console.log(lowPoint+"===="+midPoint+"===="+higPoint);

  if(x>array[midPoint-1]){

   lowPoint=midPoint+1;

  }

  else if(x<array[midPoint-1]){

   higPoint= midPoint-1;

  }

  else if(x=array[midPoint-1]){

   found=true;

  }

 } 

 if(found){

    returnValue=midPoint;

 }

 return returnValue;

}

/*var array2=[1,2,3,4,5,6,7,8,9,100,109];*/

var array2=['a','b','c','d','e','f','g'];

console.log(binarySearch(array2,'c'));
Javascript 相关文章推荐
JavaScript Chart 插件整理
Jun 18 Javascript
JavaScript中对象介绍
Dec 31 Javascript
javascript实现密码验证
Nov 10 Javascript
js检测iframe是否加载完成的方法
Nov 26 Javascript
基于jQuery实现复选框是否选中进行答题提示
Dec 10 Javascript
js传值后台中文出现乱码的解决方法
Jun 30 Javascript
详解Python中logging日志模块在多进程环境下的使用
Dec 26 Javascript
Angular2开发——组件规划篇
Mar 28 Javascript
详解vue嵌套路由-params传递参数
May 23 Javascript
vue以组件或者插件的形式实现throttle或者debounce
May 22 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
Jan 08 Javascript
vue表单验证之禁止input输入框输入空格
Dec 03 Vue.js
JavaScript数据类型检测代码分享
Jan 26 #Javascript
浅谈Javascript中的Function与Object
Jan 26 #Javascript
javascript实现动态加载CSS
Jan 26 #Javascript
使用jQuery实现返回顶部
Jan 26 #Javascript
SyntaxHighlighter 3.0.83使用笔记
Jan 26 #Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
Jan 26 #Javascript
JavaScript事件委托用法分析
Jan 24 #Javascript
You might like
PHP中的cookie不用刷新就生效的方法
2012/02/04 PHP
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
Yii配置文件用法详解
2014/12/04 PHP
PHP实现的DES加密解密实例代码
2016/04/06 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
jQuery对val和atrr(&quot;value&quot;)赋值的区别介绍
2014/09/26 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
搭建简单的nodejs http服务器详解
2017/03/09 NodeJs
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
Python素数检测实例分析
2015/06/15 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
Python实现简单的列表冒泡排序和反转列表操作示例
2019/07/10 Python
python编写简单端口扫描器
2019/09/04 Python
Python for循环搭配else常见问题解决
2020/02/11 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
django为Form生成的label标签添加class方式
2020/05/20 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
英语专业学子个人的自我评价
2013/10/02 职场文书
公务员更新知识培训实施方案
2014/03/31 职场文书
环保项目建议书
2014/08/26 职场文书
颐和园的导游词
2015/01/30 职场文书
超市员工辞职信范文
2015/05/12 职场文书
postgresql中如何执行sql文件
2023/05/08 PostgreSQL