2012-03-15 2 views
0

자바 스크립트에서 이진 검색을 작성했습니다.왜 자바 스크립트 바이너리 검색이 잘못 되었습니까?

Array.prototype.binarySearch = function(find) { 
    var low = 0, high = this.length - 1, 
     i; 
    while (low <= high) { 
    i = Math.floor((low + high)/2); 
    if (this[i] > find) { low = i; continue; }; 
    if (this[i] < find) { high = i; continue; }; 
    return i; 
    } 
    return null; 
} 

내 정수 배열에서 5가 발견 되더라도 실패합니다.

var intArray = [1, 2, 3, 5] 

if (intArray.binarySearch(5)) 
    alert("found!"); 
else 
    alert("no found!"); 

여기는 피들입니다. http://jsfiddle.net/3uPUF/3/

+1

, 당신은에서'this'을 놓치고'이 [내가]' –

+0

오 감사합니다. 나는 그것을 알아 채지 못했다. – dangerChihuahua007

+0

또한 'Array.prototype.binarySearch'를 사용하여 메소드를 정의해야하는 이유는 무엇입니까? 왜'Array.binarySearch'가 작동하지 않습니까? – dangerChihuahua007

답변

6

로직을 뒤로 또는 아래로 바꾸려면 if this[i] > find을 입력하고 1과 i-1 사이를 확인하십시오. If this[i] < find 그러면 i + 1과 배열의 길이를 살펴보고 싶습니다. 이러한 변경을

시도 : 바이올린에

Array.prototype.binarySearch = function(find) { 
    var low = 0, high = this.length - 1, 
     i; 
    while (low <= high) { 
    i = Math.floor((low + high)/2); 
    if (this[i] == find) { return i; }; 
    if (this[i] > find) { high = i - 1;}; 
    if (this[i] < find) { low = i + 1;}; 
    } 
    return null; 
} 

var intArray = [1, 2, 3, 5] 
//index of the element in the array or null if not found  
alert(intArray.binarySearch(5)); 
3

귀하의 비교 내용은 거꾸로 작성되었습니다. i에있는 항목이 찾고있는 것보다 큰 경우 이 아니라 high을 조정하려고합니다. 내 updated jsFiddle을 참조하십시오.

관련 문제