2016-10-23 4 views
1

자바 스크립트에서 이진 검색을 구현하려고합니다. 내 대본에 무슨 문제가 있는지 모르겠습니다. 검색 버튼을 클릭 할 때마다 페이지가 응답하지 않습니다. 미리 감사드립니다.자바 스크립트에서 이진 검색 구현

var i,print,arr; 
 
\t arr = [1,2,3,4,5,6,7,8,9,10]; 
 
\t print = document.getElementById("showArray"); 
 
\t for(i = 0; i < arr.length; i++){ 
 
\t print.innerHTML += arr[i] + "&nbsp;"; 
 
\t } 
 
\t function binarySearch(searchValue){ 
 
\t var lowerIndex, higherIndex, middleIndex,writeResult; 
 
\t lowerIndex = 0; 
 
\t higherIndex = arr.length; 
 
\t writeResult = document.getElementById("showResult"); 
 
\t while(lowerIndex <= higherIndex){ 
 
\t  middleIndex = (higherIndex + lowerIndex)/2; 
 
\t \t if(searchValue == arr[middleIndex]){ 
 
\t \t writeResult.innerHTML = "PRESENT"; 
 
\t \t consol.log('Present'); 
 
\t \t break; 
 
\t \t } 
 
\t \t else if(searchValue > arr[middleIndex]){ 
 
\t \t lowerIndex = middleIndex + 1; 
 
\t \t } 
 
\t \t else if(searchValue < arr[middleIndex]){ 
 
\t \t higherIndex = middleIndex - 1; 
 
\t \t } 
 
\t } 
 
\t }
<button onclick = "binarySearch(1)">SEARCH</button> 
 
\t <p id = "showArray" style = "font-size: 40px; padding:0px;">  </p> 
 
\t <p id = "showResult">Result is:</p>

+1

무한 루프. 루프의 시작 부분에'console.log (lowerIndex, higherIndex)'와 같은 것을 넣으면 무슨 일이 일어나는지 보게 될 것이다. – Cully

답변

0

Array.prototype.br_search = function (target) 
{ 
    var half = parseInt(this.length/2); 
    if (target === this[half]) 
    { 
    return half; 
    } 
    if (target > this[half]) 
    { 
    return half + this.slice(half,this.length).br_search(target); 
    } 
    else 
    { 
    return this.slice(0, half).br_search(target); 
    } 
}; 

l= [0,1,2,3,4,5,6]; 

console.log(l.br_search(5)); 
0

가장 큰 문제 같은 것을보십시오, 당신은 가지고있는 middleIndex에 대한 계산의 정수 부분을 사용하지 않는 것입니다. 따라서 인덱스는 정수 여야하므로 배열의 지정된 인덱스에서 값을 확인할 수 없습니다.

var i, 
 
    print = document.getElementById("showArray"), 
 
    arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 
 

 
for (i = 0; i < arr.length; i++) { 
 
    print.innerHTML += arr[i] + "&nbsp;"; 
 
} 
 

 
function binarySearch(searchValue) { 
 
    var lowerIndex = 0, 
 
     higherIndex = arr.length - 1, 
 
     middleIndex, 
 
     writeResult = document.getElementById("showResult"); 
 

 
    while (lowerIndex <= higherIndex) { 
 
     middleIndex = Math.floor((higherIndex + lowerIndex)/2); 
 
     if (searchValue == arr[middleIndex]) { 
 
      writeResult.innerHTML = "PRESENT " + middleIndex; 
 
      break; 
 
     } 
 
     if (searchValue > arr[middleIndex]) { 
 
      lowerIndex = middleIndex + 1; 
 
     } else { 
 
      higherIndex = middleIndex - 1; 
 
     } 
 
    } 
 
}
<button onclick="binarySearch(2)">SEARCH</button> 
 
<p id="showArray" style="font-size: 40px; padding:0px;">  </p> 
 
<p id="showResult">Result is:</p>

+0

감사합니다. 정상적으로 작동합니다. –

0

break없이 이진 검색은 반복적 예.

상영 시간 : 아마 log2(n)

function search(array, target) { 
 
    let min = array[0] 
 
    let max = array.length - 1; 
 
    let guess; 
 
    
 
    while (max >= min) { 
 
    guess = Math.floor((min+max)/2); 
 
    if (array[guess] === target) { 
 
     return guess; 
 
    } else if (array[guess] > target) { 
 
     max = guess - 1; 
 
    } else { 
 
     min = guess + 1; 
 
    } 
 
    } 
 

 
    return -1; 
 
} 
 

 
const primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]; 
 
console.log(search(primes, 67));