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之对系统的toFixed()方法的修正
May 08 Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
Dec 08 Javascript
『JavaScript』限制Input只能输入数字实现思路及代码
Apr 22 Javascript
jquery foreach使用示例
Sep 12 Javascript
node.js中的fs.lchmod方法使用说明
Dec 16 Javascript
理解Angular的providers给Http添加默认headers
Jul 04 Javascript
Node.js的进程管理的深入理解
Jan 09 Javascript
在Layui中实现开关按钮的效果实例
Sep 29 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
Mar 06 Javascript
vue路由分文件拆分管理详解
Aug 13 Javascript
vue实现简单的登录弹出框
Oct 26 Javascript
手写Spirit防抖函数underscore和节流函数lodash
Mar 22 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
解决中英文字符串长度问题函数
2007/01/16 PHP
php heredoc和phpwind的模板技术使用方法小结
2008/03/28 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
2013/01/23 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
jquery插件orbit.js实现图片折叠轮换特效
2015/04/14 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
详解在vue-test-utils中mock全局对象
2018/11/07 Javascript
JS使用正则表达式提交页面验证的代码
2019/10/16 Javascript
[46:14]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python 正则表达式 概述及常用字符
2009/05/04 Python
python添加模块搜索路径方法
2017/09/11 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
Python中的单继承与多继承实例分析
2018/05/10 Python
python 求一个列表中所有元素的乘积实例
2019/06/11 Python
解决Django no such table: django_session的问题
2020/04/07 Python
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
关于递归的一道.NET面试题
2013/05/12 面试题
学生实习介绍信
2014/01/15 职场文书
社区庆八一活动方案
2014/02/02 职场文书
个人典型事迹材料
2014/12/30 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
Redis源码阅读:Redis字符串SDS详解
2021/07/15 Redis
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
2021/11/01 MongoDB