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 键盘事件的组合使用实现代码
May 04 Javascript
js DOM 元素ID就是全局变量
Sep 20 Javascript
表单验证正则表达式实例代码详解
Nov 09 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
Jul 09 Javascript
浅谈EasyUI常用控件的禁用方法
Nov 09 Javascript
Webpack执行命令参数详解
Jun 17 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
Jul 19 Javascript
js实现带进度条提示的多视频上传功能
Dec 13 Javascript
浅谈手写node可读流之流动模式
Jun 01 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
Sep 24 Javascript
Vue 实现分页与输入框关键字筛选功能
Jan 02 Javascript
Angular性能优化之第三方组件和懒加载技术
May 10 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
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
PHP实现发送微博消息功能完整示例
2019/12/04 PHP
关于this和self的使用说明
2010/08/01 Javascript
使用JavaScript动态设置样式实现代码及演示动画
2013/01/25 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
nodejs实现获取某宝商品分类
2015/05/28 NodeJs
纯HTML5制作围住神经猫游戏-附源码下载
2015/08/23 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
详解jquery选择器的原理
2017/08/01 jQuery
微信小程序 自定义消息提示框
2017/08/06 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
使用D3.js+Vue实现一个简单的柱形图
2018/08/05 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
python 字符串格式化代码
2013/03/17 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
Python综合应用名片管理系统案例详解
2020/01/03 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
2020/03/16 Python
Python pysnmp使用方法及代码实例
2020/08/24 Python
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
JAVA中运算符的分类及举例
2015/09/12 面试题
单位成立周年感言
2014/01/26 职场文书
《骆驼和羊》教学反思
2014/02/27 职场文书
信息工作经验交流材料
2014/05/28 职场文书
汽车广告策划方案
2014/05/31 职场文书
平安家庭事迹材料
2014/12/20 职场文书
中学生思想品德评语
2014/12/31 职场文书
党校毕业个人总结
2015/02/28 职场文书
诚信高考倡议书
2019/06/24 职场文书
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android