javascript折半查找详解

折半查找法

在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现:

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'));

(0)

相关推荐

  • 基于JavaScript实现的折半查找算法示例

    本文实例讲述了基于JavaScript实现的折半查找算法.分享给大家供大家参考,具体如下: 折半查找也叫做二分查找,是针对有序表的一种查找方式,其思想如下: 将数组的第一个位置设为下边界: 将数组的最后一个位置设为上边界: 如果下边界等于或小于上边界,则做如下操作: 将中点设置为上边界加下边界之和除以二:    如果中点的元素小于查询的值,则将下边界设置为中点元素所在下标加1:    如果中点的元素大于查询的值,则将上边界设置为中点元素所在下标减1:    否则中点元素即为要查找的元素,可以进行

  • js基本算法:冒泡排序,二分查找的简单实例

    知识扩充: 时间复杂度:算法的时间复杂度是一个函数,描述了算法的运行时间.时间复杂度越低,效率越高. 自我理解:一个算法,运行了几次时间复杂度就为多少,如运行了n次,则时间复杂度为O(n). 1.冒泡排序 解析:1.比较相邻的两个元素,如果前一个比后一个大,则交换位置. 2.第一轮的时候最后一个元素应该是最大的一个. 3.按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较. function sort(elements){ for(var i

  • javascript 折半查找字符在数组中的位置(有序列表)

    复制代码 代码如下: /** * 折半查找字符在数组中的位置(有序列表) * @param array 被检索的数组 * @param x 要查找的字符 * @type int * @returns 字符在数组中的位置,没找到返回-1 */ function binarySearch(array,x){ var lowPoint=1; var higPoint=array.length; var returnValue=-1; var midPoint; var found=false; whi

  • javascript实现二分查找法实现代码

    一般二分都用到int[]型上.....在js中可能会更灵活的用到a-z上,或者用到拼音...或者用到...... 不过值得深思的一个问题是,如果为了实现对拼音之类的二分查找.而经过如下流程是否值得: 1.对拼音排序,貌似代码量不小吧. 2.然后再二分查找.这又需要识别拼音的大小,貌似也不算太小吧. 找到结果的速度快了,可是别人下你的js文件速度慢多了,呵呵,到底舍弃谁. 下面的代码甚至可以10亿条,一样会很快找到,可是用遍例的模式创建那个数组...所以还是别尝试了.只是给个思路,下次我再来发个j

  • JavaScript使用二分查找算法在数组中查找数据的方法

    本文实例讲述了JavaScript使用二分查找算法在数组中查找数据的方法.分享给大家供大家参考.具体分析如下: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一

  • js实现的二分查找算法实例

    本文实例讲述了js实现的二分查找算法.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html> <head> <title>demo</title> <style type="text/css"> </style> <script type="text/javascript"> var binarySearch = function(array, s

  • JavaScript实现二分查找实例代码

    二分查找的前提为:数组.有序.逻辑为:优先和数组的中间元素比较,如果等于中间元素,则直接返回.如果不等于则取半继续查找. /** * 二分查找,递归实现. * @param target * @param arr * @param start * @param end * @returns {*} */ function binarySearch(target,arr,start,end) { var start = start || 0; var end = end || arr.length

  • JavaScript数据结构之二叉树的查找算法示例

    本文实例讲述了JavaScript数据结构之二叉树的查找算法.分享给大家供大家参考,具体如下: 前面文章介绍了二叉树的遍历,现在谈谈在二叉树中进行查找.对二叉查找树来说,一般有以下三类查找:最大值,最小值和给定值. 查找最小值就是遍历左子树,直到找到最后一个结点,这是因为在二叉查找树中较小的值总是在左子节点上的. 代码如下: function getMin(){//查找最小值 var current=this.root;//指向根节点 while(current.left!=null){ cur

  • 基于JavaScript实现的顺序查找算法示例

    本文实例讲述了基于JavaScript实现的顺序查找算法.分享给大家供大家参考,具体如下: 对于查找数据来说,最简单的方法就是从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果.这个方法叫做顺序查找,有时候也被叫做线性查找.它属于暴力查找技巧的一种. 顺序查找实现起来非常简单,代码如下: function generalSearch(arr,data){//普通的顺序查找,就是遍历一遍看是否找到 for(var i=0;i<arr.length;i++){ if(arr[i]==

  • JavaScript黑洞数字之运算路线查找算法(递归算法)实例

    本文实例讲述了JavaScript黑洞数字之运算路线查找算法.分享给大家供大家参考,具体如下: 运行效果截图如下: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/19

随机推荐