我在javascript中写了一个二进制搜索。
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/
答案 0 :(得分: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));
答案 1 :(得分:3)
您的比较是倒退的。如果在i
找到的项目大于您要查找的内容,则需要调整high
,而不是low
。查看我的updated jsFiddle。