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 相关文章推荐
多个iframe自动调整大小的问题
Sep 18 Javascript
用Javascript 获取页面元素的位置的代码
Sep 25 Javascript
Javascript计算时间差的函数分享
Jul 04 Javascript
深入浅出分析javaScript中this用法
May 09 Javascript
JavaScript必知必会(六) delete in instanceof
Jun 08 Javascript
ES6中的数组扩展方法
Aug 26 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
Oct 27 Javascript
JavaScript自定义分页样式
Jan 17 Javascript
Javascript基础回顾之(二) js作用域
Jan 31 Javascript
JavaScript中Promise的使用详解
Feb 26 Javascript
浅谈webpack-dev-server的配置和使用
May 17 Javascript
js实现简单掷骰子效果
Oct 24 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
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
2013/06/01 PHP
php实现生成验证码实例分享
2016/04/10 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
IE bug table元素的innerHTML
2010/01/11 Javascript
jquerydom对象的事件隐藏显示和对象数组示例
2013/12/10 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
jQuery中get和post方法传值测试及注意事项
2014/08/08 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
详解封装基础的angular4的request请求方法
2018/06/05 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
vue+element-ui动态生成多级表头的方法
2018/08/28 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
Python简单日志处理类分享
2015/02/14 Python
Python实现string字符串连接的方法总结【8种方式】
2018/07/06 Python
python多进程读图提取特征存npy
2019/05/21 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
学生会主席就职演讲稿
2014/01/14 职场文书
小学美术教学反思
2014/02/01 职场文书
二人合伙经营协议书
2014/09/13 职场文书
法定代表人授权委托书格式
2014/10/14 职场文书
安全员岗位职责
2015/02/10 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
师德承诺书2015
2015/04/28 职场文书
初三数学教学反思
2016/02/17 职场文书
2016年全国助残日活动总结
2016/04/01 职场文书
javaScript Array api梳理
2021/03/31 Javascript
python munch库的使用解析
2021/05/25 Python
python 批量压缩图片的脚本
2021/06/02 Python