JavaScript中的二进制数组搜索

时间:2015-12-16 03:40:06

标签: javascript arrays loops

我似乎无法使此代码正常工作。如果密钥在数组中,则代码应该提醒True,如果它不在数组中,它应该提醒false。我似乎无法做到这一点。谢谢!

<!DOCTYPE HTML>
<html lang="en-us">

<head>
<meta charset="utf-8">
<title>Search</title>
<script type="text/javascript">
    function testFunction() {
        var list = [ 1, 2, 3, 4, 5, 6, 7 ];
        var key = 9;
        var result1 = 0;
        //var result2 = 0;
        result1 = search(list, key);

    }
    function search(list, key) {
        var left = 0;
        var right = list.length - 1;
        while (left <= right) {
            var mid = left + ((right - left) >>> 1);
            var cmp = key - list[mid];
            if (cmp > 0 ){
                left = alert("True");
            } else if (cmp < 0){
                alert("False");
            }else {
                return mid;
            }
                return mid;
            }
        }
</script>
</head>
<h1>Search:</h1>
<button type="button" onclick="testFunction()">Volume</button>
<div id="outputDiv"></div>

</html>

2 个答案:

答案 0 :(得分:1)

例如,如果您遇到这两个条件,那么您很少会看到这样做的优势,而不是.indexOf

  1. 您的数据已订购
  2. 您希望继续扩展它以使用比较器
  3. 现在,你似乎没有移动你的中间点,只是返回它,而是尝试类似

    function search(haystack, needle, i, j) {
        var k;
        if (i !== 0 && !i) i = 0;
        if (j !== 0 && !j) j = haystack.length - 1;
        if (needle < haystack[i] || haystack[j] < needle) return false;
        if (i === j) return haystack[i] === needle;
        while (i < j) {
            k = Math.floor(i + (j - i) / 2);
            if (haystack[k] === needle) return true;
            if (haystack[k] < needle) i = k + 1;
            else j = k - 1;
        }
        return (i === j) && (haystack[i] === needle);
    }
    

    所以你有

    var arr = [1, 2, 3, 4, 5];
    
    search(arr, 0); // false
    search(arr, 1); // true
    search(arr, 2); // true
    search(arr, 3); // true
    search(arr, 4); // true
    search(arr, 5); // true
    search(arr, 6); // false
    
      

    编写一个名为search的JavaScript函数,它接受两个参数:一个名为list的数组和一个名为key的数字。该函数必须确定密钥是否存储在列表中。如果数字存储在数组中,则代码应返回true,否则返回false。

    function search(list, key) {
        return list.indexOf(key) !== -1;
    }
    

    在ECMAScript 6环境中,您可以使用Array.prototype.findIndex

    编写比较版本
    function search(list, key) {
        return list.findIndex(e => e === key) !== -1;
    }
    

答案 1 :(得分:-1)

可能是你可以试试这个二元搜索功能

function binarySearch(array, key) {
    var lo = 0,
        hi = array.length - 1,
        mid,
        element;
    while (lo <= hi) {
        mid = ((lo + hi) >> 1);
        element = array[mid];
        if (element < key) {
            lo = mid + 1;
        } else if (element > key) {
            hi = mid - 1;
        } else {
            return mid;
        }
    }
    return -1;
}