Heim  >  Artikel  >  Web-Frontend  >  javascript折半查找详解_javascript技巧

javascript折半查找详解_javascript技巧

WBOY
WBOYOriginal
2016-05-16 16:17:591789Durchsuche

折半查找法

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

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     { 
        mid = (beg + last) / 2; 
        if (x == data[mid] ) 
        { 
            return mid; 
        } 
        else if (data[mid]         { 
            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     { 
        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     int siz = sizeof(data1)/sizeof(int); 
    for (int i = 0; i     { 
        data1[i] = i; 
        cout     } 
    cout     int index = -1; 
    //index = BiSearch(data1, no2search, 0, siz); 
    index = IterBiSearch(data1, no2search, 0, siz); 
    cout     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   midPoint=Math.ceil((lowPoint+higPoint)/2);
  //console.log(lowPoint+"===="+midPoint+"===="+higPoint);
  if(x>array[midPoint-1]){
   lowPoint=midPoint+1;
  }
  else if(x    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'));
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn