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 相关文章推荐
js自动闭合html标签(自动补全html标记)
Oct 04 Javascript
js实现获取当前时间是本月第几周的方法
Aug 11 Javascript
详解Node.js模块间共享数据库连接的方法
May 24 Javascript
JS实现旋转木马式图片轮播效果
Jan 18 Javascript
理解Angular的providers给Http添加默认headers
Jul 04 Javascript
vuejs实现本地数据的筛选分页功能思路详解
Nov 15 Javascript
JS实现快递单打印功能【推荐】
Jun 21 Javascript
JS常见构造模式实例对比分析
Aug 27 Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
May 01 Javascript
vue读取本地的excel文件并显示在网页上方法示例
May 29 Javascript
JS原型prototype和__proto__用法实例分析
Mar 14 Javascript
cypress测试本地web应用
Jun 01 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中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
2016/06/06 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
php技巧小结【推荐】
2017/01/19 PHP
JQuery之拖拽插件实现代码
2011/04/14 Javascript
js下拉框二级关联菜单效果代码具体实现
2013/08/03 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
javascript实现随机显示星星特效
2016/01/28 Javascript
JavaScript解八皇后问题的方法总结
2016/06/12 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
JS+html5制作简单音乐播放器
2020/09/13 Javascript
vue绑定设置属性的多种方式(5)
2017/08/16 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
vue.js中使用echarts实现数据动态刷新功能
2019/04/16 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
在Django框架中设置语言偏好的教程
2015/07/27 Python
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
Django REST framework视图的用法
2019/01/16 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
python suds访问webservice服务实现
2020/06/26 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
工程材料采购方案
2014/05/18 职场文书
公司合并协议书范本
2014/09/30 职场文书
2015年党风廉政承诺书
2015/01/22 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
2016公司年会主持词
2015/07/01 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
工作报告范文
2019/06/20 职场文书