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 相关文章推荐
location.href语句与火狐不兼容的问题
Jul 04 Javascript
弹出最简单的模式化遮罩层的js代码
Dec 04 Javascript
使用jQuery jqPlot插件绘制柱状图
Dec 18 Javascript
js实现千分符和保留几位小数的简单实例
Aug 01 Javascript
Bootstrap3 图片(响应式图片&amp;图片形状)
Jan 04 Javascript
js实现扫雷小程序的示例代码
Sep 27 Javascript
vue组件jsx语法的具体使用
May 21 Javascript
vue中render函数的使用详解
Oct 12 Javascript
Vue.js 中的实用工具方法【推荐】
Jul 04 Javascript
vue组件 keep-alive 和 transition 使用详解
Oct 11 Javascript
基于javascript的无缝滚动动画实现2
Aug 07 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
Aug 18 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
smarty模板引擎中变量及变量修饰器用法实例
2015/01/22 PHP
PHP面试常用算法(推荐)
2016/07/22 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
利用js跨页面保存变量做菜单的方法
2008/01/17 Javascript
JQuery select标签操作代码段
2010/05/16 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
js实现日历与定时器
2017/02/22 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
2020/02/11 Javascript
在vs code 中如何创建一个自己的 Vue 模板代码
2020/11/10 Javascript
Web服务器框架 Tornado简介
2014/07/16 Python
python实现给数组按片赋值的方法
2015/07/28 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
Python去除、替换字符串空格的处理方法
2018/04/01 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
2018/11/06 Python
解决Python一行输出不显示的问题
2018/12/03 Python
python3实现mysql导出excel的方法
2019/07/31 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
金融专业大学生自我评价
2014/01/09 职场文书
厕所文明标语
2014/06/11 职场文书
党员检讨书范文
2014/12/27 职场文书
总经理检讨书范文
2015/02/16 职场文书
2015年工会工作总结
2015/03/30 职场文书
2015年乡镇发展党员工作总结
2015/03/31 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
2015年档案室工作总结
2015/05/23 职场文书
歌剧魅影观后感
2015/06/05 职场文书