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 innerText和innerHtml应用
Jan 28 Javascript
获取客户端电脑日期时间js代码(jquery)
Sep 12 Javascript
Javascript自定义排序 node运行 实例
Jun 05 Javascript
jquery ajax属性async(同步异步)示例
Nov 05 Javascript
12306验证码破解思路分享
Mar 25 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
Dec 31 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
Dec 19 Javascript
jquery中用函数来设置css样式
Dec 22 Javascript
原生JS封装_new函数实现new关键字的功能
Aug 12 Javascript
vue实现跨域的方法分析
May 21 Javascript
在vue-cli创建的项目中使用sass操作
Aug 10 Javascript
js实现简易点击切换显示或隐藏
Nov 29 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
无线电广播的开始
2002/01/30 无线电
PHPMyAdmin 快速配置方法
2009/05/11 PHP
推荐10个提供免费PHP脚本下载的网站
2014/12/31 PHP
PHP文件下载实例代码浅析
2016/08/17 PHP
phpmyadmin在宝塔面板里进不去的解决方案
2020/07/06 PHP
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
JS trim去空格的最佳实践
2011/10/30 Javascript
jQuery UI Dialog 创建友好的弹出对话框实现代码
2012/04/12 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
JavaScript中日常收集常见的10种错误(推荐)
2017/01/08 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
2017/02/20 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
微信小程序scroll-view实现字幕滚动
2018/07/14 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
对于防止按钮重复点击的尝试详解
2019/04/22 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
vue-resource 拦截器interceptors使用详解
2021/01/18 Vue.js
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
对python3新增的byte类型详解
2018/12/04 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
Python实现弹球小游戏
2020/08/01 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
GWT (Google Web Toolkit)有哪些主要的原件组成?
2015/06/08 面试题
程序员岗位职责
2013/11/11 职场文书
幼儿园教师培训制度
2014/01/16 职场文书
观后感开头
2015/06/19 职场文书
如何写新闻稿
2015/07/18 职场文书