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 相关文章推荐
JQuery中节点遍历方法实例
May 18 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
Nov 17 Javascript
JS使用cookie设置样式的方法
Jun 30 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
Sep 28 Javascript
Vue.js系列之项目结构说明(2)
Jan 03 Javascript
详谈for循环里面的break和continue语句
Jul 20 Javascript
jQuery.Ajax()的data参数类型详解
Jul 23 jQuery
JS获取url参数,JS发送json格式的POST请求方法
Mar 29 Javascript
JS实现的文件拖拽上传功能示例
May 21 Javascript
vue底部加载更多的实例代码
Jun 29 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
Jul 24 Javascript
如何使用RoughViz可视化Vue.js中的草绘图表
Jan 30 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 处理图片的类实现代码
2009/10/23 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
JavaScript创建命名空间的5种写法
2014/06/24 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
2019/10/24 PHP
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
jQuery实现提示密码强度的代码
2015/07/15 Javascript
老生常谈 关于JavaScript的类的继承
2016/06/24 Javascript
老生常谈的跨域处理
2017/01/11 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
vue iview实现动态路由和权限验证功能
2018/04/17 Javascript
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
Python2与python3中 for 循环语句基础与实例分析
2017/11/20 Python
PyCharm代码提示忽略大小写设置方法
2018/10/28 Python
Python读取excel指定列生成指定sql脚本的方法
2018/11/28 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
2019/05/10 Python
python科学计算之narray对象用法
2019/11/25 Python
浅析Python3 pip换源问题
2020/01/06 Python
体育纪念品、亲笔签名的体育收藏品:Steiner Sports
2020/07/31 全球购物
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
香奈儿美国官网:CHANEL美国
2020/05/20 全球购物
一个C/C++编程面试题
2013/11/10 面试题
大学生入党思想汇报
2014/01/14 职场文书
思想品德自我评价
2014/02/04 职场文书
车队司机个人自我鉴定
2014/04/17 职场文书
签订劳动合同通知书
2015/04/16 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
小学六一主持词开场白
2015/05/28 职场文书
汽车销售员工作总结
2015/08/12 职场文书
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技