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.ui.dialog 增加“在当前鼠标位置打开”的功能
Nov 24 Javascript
div+css布局的图片连续滚动js实现代码
May 04 Javascript
js中用window.open()打开多个窗口的name问题
Mar 13 Javascript
简单实现JS对dom操作封装
Dec 02 Javascript
JavaScript生成二维码图片小结
Dec 27 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
Nov 18 Javascript
js返回顶部实例分享
Dec 21 Javascript
javascript 秒表计时器实现代码
Mar 09 Javascript
详解axios在node.js中的post使用
Apr 27 Javascript
vue.js 实现评价五角星组件的实例代码
Aug 13 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
Aug 31 Javascript
Javascript执行上下文顺序的深入讲解
Nov 04 Javascript
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设计模式之观察者模式的应用详解
2013/05/21 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
form表单传递数组数据、php脚本接收的实例
2017/02/09 PHP
javascript 模式设计之工厂模式学习心得
2010/04/27 Javascript
将光标定位于输入框最右侧实现代码
2012/12/04 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
js构造函数、索引数组和属性的实现方式和使用
2014/11/16 Javascript
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
浅谈JavaScript 覆盖原型以及更改原型
2016/08/31 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
layer弹窗插件操作方法详解
2017/05/19 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
通过Python实现一个简单的html页面
2020/05/16 Python
python3定位并识别图片验证码实现自动登录功能
2021/01/29 Python
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
介绍一下gcc特性
2012/01/20 面试题
超市业务员岗位职责
2013/12/05 职场文书
自荐信写法介绍
2014/01/25 职场文书
产品质量承诺书
2014/03/27 职场文书
岗位工作说明书
2014/07/29 职场文书
服务员岗位职责范本
2015/04/09 职场文书
大学生求职意向书
2015/05/11 职场文书
新郎婚礼致辞
2015/07/27 职场文书
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
2021/06/09 Python
Python字符串的转义字符
2022/04/07 Python
如何更改Win11声音输出设备?Win11声音输出设备四种更改方法
2022/04/08 数码科技
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python