在javascript中搜索排序列表中的项目的最佳方法是什么?

时间:2009-12-03 01:18:30

标签: javascript arrays sorting

我有一个有序的整数列表,并希望搜索它们。

最快的方法是什么?

这是最快的吗?或者我们可以优化它,因为它是有序的吗?

Array.prototype.Contains = function(value) {
    for (var index = 0; index < this.length; index++) {
        if (value == this[index]) {
            return true;
        }
    }
    return false;
}

由于

3 个答案:

答案 0 :(得分:7)

尝试实施“binary search”:

Array.prototype.binarySearch = function(v) {

    /* ARRAY MUST BE SORTED */

    if ( !this.length ) { return false; }
    if ( this[0] === v ) { return true; }

    var i, mid,
        start = 0,
        end = this.length,
        c = false;

    while ( c = (i = this[mid = start+((end-start)>>1)]) !== v ) {

        i < v ? (start = mid) : (end = mid);

        if (start >= end - 1) { break; }

    }

    return !c;

};

答案 1 :(得分:4)

如果列表已排序,则最快的方法是始终二进制搜索。只要您有一个有序列表,所有语言都是如此。

http://en.wikipedia.org/wiki/Binary_search_algorithm

答案 2 :(得分:1)

从排序列表中返回找到的项目的索引通常很方便。可选的第二个参数确定是否返回布尔值或索引。

Array.prototype.biSearch= function(v, ret){
 var L= this.length, i= -1, m;
 while(L - i> 1){
  if(this[m= L + i>> 1]< v) i= m;
  else L= m;
 }
 if(ret) return this[L]== v? L: -1;
 return this[L]== v;
}

实际上,相同的代码可以用于另一个常见任务 - 将项添加到已排序的数组中,而无需对整个数组进行重新排序。

如果未发送第二个参数,则只有在数组中尚不存在该项目时才会插入该项目。

Array.prototype.addtoSort= function(v, dup){
 var L= this.length, i= -1, m;
 while(L - i> 1){
  if(this[m= L + i>> 1]< v) i= m;
  else L= m;
 }
 if(this[L]!= v || dup){
  return this.splice(L,0,v);
 }
 return this.length;
}