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 相关文章推荐
User Scripts: Video Download by User Scripts
May 14 Javascript
js判断当前页面在移动设备还是在PC端中打开
Jan 06 Javascript
javascript实现2016新年版日历
Jan 25 Javascript
JQuery遍历元素的父辈和祖先的方法
Sep 18 Javascript
微信小程序入门教程
Nov 18 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
Dec 07 Javascript
利用forever和pm2部署node.js项目过程
May 10 Javascript
vue弹窗组件的实现示例代码
Sep 10 Javascript
js实现全选反选不选功能代码详解
Apr 24 Javascript
laravel-admin 与 vue 结合使用实例代码详解
Jun 04 Javascript
JavaScript创建、读取和删除cookie
Sep 03 Javascript
原生JavaScript实现滑动拖动验证的示例代码
Dec 06 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 echo 输出字符串函数详解
2010/05/13 PHP
php类常量用法实例分析
2015/07/09 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
2015/12/18 PHP
详解PHP的Yii框架中扩展的安装与使用
2016/04/01 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
JQuery为textarea添加maxlength属性的代码
2010/04/07 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
2013/10/21 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
Web安全测试之XSS实例讲解
2016/08/15 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
2017/04/20 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
2017/09/01 jQuery
webpack多页面开发实践
2017/12/18 Javascript
JS实现获取进今年第几天是周几的方法分析
2018/06/27 Javascript
利用jqgrid实现上移下移单元格功能
2018/11/07 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
vue实现鼠标移过出现下拉二级菜单功能
2019/12/12 Javascript
解决新建一个vue项目过程中遇到的问题
2020/10/22 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
Python 保持登录状态进行接口测试的方法示例
2019/08/06 Python
pytorch实现onehot编码转为普通label标签
2020/01/02 Python
解决python replace函数替换无效问题
2020/01/18 Python
python3中TQDM库安装及使用详解
2020/11/18 Python
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
Bodum官网:咖啡和茶壶、玻璃器皿、厨房电器等
2018/08/01 全球购物
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
志愿者宣传口号
2014/06/17 职场文书
交通事故协议书范文
2014/10/23 职场文书
军训后的感想
2015/08/07 职场文书