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,jquery闭包概念分析
Jun 19 Javascript
javascript 构造函数强制调用经验总结
Dec 02 Javascript
在js(jquery)中获得文本框焦点和失去焦点的方法
Dec 04 Javascript
js判断样式className同时增加class或删除class
Jan 30 Javascript
JavaScript的事件绑定(方便不支持js的时候)
Oct 01 Javascript
js中对象的声明方式以及数组的一些用法示例
Dec 11 Javascript
JavaScript继承模式粗探
Jan 12 Javascript
第二篇Bootstrap起步
Jun 21 Javascript
JS中的三个循环小结
Jun 20 Javascript
Angular4表单验证代码详解
Sep 03 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
May 02 Javascript
使用layer模态框给新页面传值的方法
Sep 27 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 mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
PHP中PDO基础教程 入门级
2011/09/04 PHP
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
PHP-Java-Bridge使用笔记
2014/09/22 PHP
PHP中的数组处理函数实例总结
2016/01/09 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
制作特殊字的脚本
2006/06/26 Javascript
js实现在文本框光标处添加字符的方法介绍
2012/11/24 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
判断一个变量是数组Array类型的方法
2013/09/16 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
jquery得到iframe src属性值的方法
2014/09/25 Javascript
使用requestAnimationFrame实现js动画性能好
2015/08/06 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
2015/11/09 Javascript
js纯数字逐一停止显示效果的实现代码
2016/03/16 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
详解vue.js下引入百度地图jsApi的两种方法
2018/07/27 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
python将txt文件读取为字典的示例
2018/12/22 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
总经理秘书的岗位职责
2013/12/27 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
市场部岗位职责
2015/02/12 职场文书
七一晚会主持词
2015/06/29 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书