2015-12-16 155 views
-1

我似乎無法讓此代碼正常工作。如果它們的鍵在數組中,則代碼應該提示True,如果它不在數組中,它應該提示false。我似乎無法做到。謝謝!JavaScript中的二進制數組搜索

<!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> 
+0

我敢寫這樣的比較版本確定'>>>'不正確...只需使用'>' – Markasoftware

+2

爲什麼不只是'list.indexOf(key)'? –

+0

是的,這對於你想要做的事似乎太複雜了。只要在搜索功能中執行'return list.indexOf(key)!== - 1',沒有其他任何東西 – Markasoftware

回答

1

有極少數的情況下,您會看到這樣做的,而不是.indexOf本的優勢,例如,如果你符合這兩個條件

  1. 你的數據是有序的
  2. 你希望繼續擴展這個使用比較器

現在,你似乎沒有移動你的中點,但只是返回它,而不是嘗試像

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 

寫了一個名爲搜索JavaScript函數有兩個參數:一個數組列表命名和命名的數字鍵。該函數必須確定密鑰是否存儲在列表中。如果數字存儲在數組中,則您的代碼應該返回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; 
} 
+0

@ user2864740你是對的,_only_太排他了。我已經重新措辭,謝謝! –

+0

編輯將'i === j'測試移出循環,測試完成了'2 *迭代'(循環中的'==='和條件中的<='),現在只是'迭代+ 2' –

+0

正如你所看到的我是一個noob,我想了解你的代碼。以下是我的工作內容: 編寫一個名爲search的JavaScript函數,該函數接受兩個參數:一個名爲list的數組和一個名爲key的數字。該函數必須確定密鑰是否存儲在列表中。如果數字存儲在數組中,則您的代碼應該返回true,否則返回false。使用此功能標題的功能: 函數搜索(列表,鍵){ – user5500799

-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; 
} 
+0

你的代碼看起來類似於我正在嘗試做的事情,我如何才能知道它是否正確或錯誤?如果找到密鑰,則爲真;如果不是,則爲假? – user5500799

+0

var result = binarySearch(array,key); if(result> = 0){alert(「True」);} else {alert(「False」);} –