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 尚未实现错误解决办法
Nov 27 Javascript
Prototype Number对象 学习
Jul 19 Javascript
浅析js封装和作用域
Jul 09 Javascript
Jquery 获取对象的几种方式介绍
Jan 17 Javascript
可自定义速度的js图片无缝滚动示例分享
Jan 20 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
May 11 Javascript
C++中的string类的用法小结
Aug 07 Javascript
AngularJS上拉加载问题解决方法
May 23 Javascript
微信小程序  简单实例(阅读器)的实例开发
Sep 29 Javascript
Vuejs实现购物车功能
Nov 05 Javascript
Django+vue跨域问题解决的详细步骤
Jan 20 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
May 15 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编码转换
2012/11/05 PHP
preg_match_all使用心得分享
2014/01/31 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
PHP生成随机字符串实例代码(字母+数字)
2019/09/11 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
2016/08/29 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
js解决软键盘遮挡输入框的问题分享
2017/12/19 Javascript
浅谈Vue 数据响应式原理
2018/05/07 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
2019/04/17 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
python采集博客中上传的QQ截图文件
2014/07/18 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
在vscode中配置python环境过程解析
2019/09/28 Python
使用python+whoosh实现全文检索
2019/12/09 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
2020/02/29 Python
python实现将range()函数生成的数字存储在一个列表中
2020/04/02 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
资深生产主管自我评价
2013/09/22 职场文书
应届生求职推荐信
2013/10/28 职场文书
食品厂厂长岗位职责
2014/01/30 职场文书
军神教学反思
2014/02/04 职场文书
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
在校生证明
2015/06/17 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书