我正在学习算法,因此我尝试将二进制搜索的python实现转换为Javascript,但这不起作用。我无法解决这个问题。
var search = function(array, key) {
let begin = 0;
let end = array.length - 1;
while (begin <= end) {
var mid = (begin + end) / 2;
if (key == array[mid]) {
return mid;
break;
} else if (key > array[mid]) {
begin = mid + 1;
} else if (key < array[mid]) {
end = mid - 1;
}
return null
}
}
var arr = [9, 56, 89, 333, 143, 543, 64, 332, 23];
var info = arr.sort((arr, b) => {
return arr - b
});
console.log(search(info, 9));
//Output is always null
&#13;
答案 0 :(得分:1)
程序中的一个微妙错误。
首先,return null
应该在while
之外,现在对于主要部分(begin + end) / 2
,如果(begin + end)
是奇数,除以2会返回一个浮点数而不是一个整数索引。
所以你必须使用像parseInt()
var mid = parseInt((begin + end) / 2);
答案 1 :(得分:0)
我纠正了一点:
var search = function(array, key) {
let begin = 0;
let end = array.length - 1;
while (begin <= end) {
var mid = Math.floor((begin + end) / 2);
if (key == array[mid]) {
return array[mid];
} else if (key > array[mid]) {
begin = mid + 1;
} else if (key < array[mid]) {
end = mid - 1;
}
}
return null
}
var arr = [9, 56, 89, 333, 143, 543, 64, 332, 23];
var info = arr.sort((arr, b) => {
return arr - b
});
console.log(info);
console.log(search(info, 9));
答案 2 :(得分:0)
除了似乎错位的return null之外,我还看到另一个问题:
如果你的数组的长度是偶数,(即:8)
begin = 0, end = 8 - 1 = 7, => mid = (begin + end) / 2 = 7 / 2 = 3.5
JavaScript将返回:
array[mid] = array[3.5] = undefined
答案 3 :(得分:-1)
问题是你在循环中返回null。将它移到循环外
var search = function(array, key) {
let begin = 0;
let end = array.length - 1;
while (begin <= end) {
var mid = Math.floor((begin + end) / 2);
if (key == array[mid]) {
return mid;
} else if (key > array[mid]) {
begin = mid + 1;
} else if (key < array[mid]) {
end = mid - 1;
}
}
return null;
}