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 相关文章推荐
才发现的超链接js导致网页中GIF动画停止的解决方法
Nov 02 Javascript
jQuery封装的获取Url中的Get参数示例
Nov 26 Javascript
使用jQuery动态加载js脚本文件的方法
Apr 03 Javascript
Jquery遍历Json数据的方法
Apr 20 Javascript
javascript实现简单查找与替换的方法
Jul 22 Javascript
详解JavaScript基于面向对象之创建对象(2)
Dec 10 Javascript
bootstrap警告框使用方法解析
Jan 13 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
Apr 10 jQuery
bootstrap表格内容过长时用省略号表示的解决方法
Nov 21 Javascript
AngularJS与BootStrap模仿百度分页的示例代码
May 23 Javascript
vue translate peoject实现在线翻译功能【新手必看】
Jun 07 Javascript
vue cli 3.x 项目部署到 github pages的方法
Apr 17 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
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
PHP用SAX解析XML的实现代码与问题分析
2011/08/22 PHP
discuz目录文件资料汇总
2014/12/30 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
JavaScript动态添加列的方法
2015/03/25 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
javascript弹出窗口实现代码
2015/11/12 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
javascript中join方法实例讲解
2019/02/21 Javascript
Vue.js中的组件系统
2019/05/30 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
解决layer.confirm快速点击会重复触发事件的问题
2019/09/23 Javascript
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
JS如何生成动态列表
2020/09/22 Javascript
vue实现登录功能
2020/12/31 Vue.js
python实现多线程行情抓取工具的方法
2018/02/28 Python
Python对象属性自动更新操作示例
2018/06/15 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
python交易记录链的实现过程详解
2019/07/03 Python
Python3+Appium安装使用教程
2019/07/05 Python
我们为什么要减少Python中循环的使用
2019/07/10 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
Tensorflow 模型转换 .pb convert to .lite实例
2020/02/12 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
python 错误处理 assert详解
2020/04/20 Python
阿根廷网上配眼镜:SmartBuyGlasses阿根廷
2016/08/19 全球购物
捐款倡议书范文
2014/02/02 职场文书
小学教师师德感言
2014/02/10 职场文书
建设单位项目负责人任命书
2014/06/06 职场文书
实习单位推荐信
2015/03/27 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
德劲DE1102数字调谐收音机机评
2022/04/07 无线电