【发布时间】:2016-11-14 09:28:42
【问题描述】:
我正在尝试编写一个我以前从未做过的“二进制搜索”。当搜索的值为 6 或 2 时,下面的代码不起作用,我想知道我做错了什么以及如何解决它。
编辑
为了解释它应该做什么(根据我的理解),二分搜索要求数组已经排序,然后查找数组的中点索引。例如,如果一个数组有九个索引 (0-8),那么中点就是索引 4。
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
然后,算法会确定该中点的值是否高于或低于您正在搜索的数字。数组一侧不包含搜索到的数字并且在中点值之前存在的所有元素都将被删除。如果搜索值是 8,那么结果将是:
[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
array midpoint value: 5
[ 5, 6, 7, 8, 9 ]
array midpoint value: 7
[ 7, 8, 9 ]
array midpoint value: 8
代码
//_________________________________________________BEGIN notes
// Step 1. Get length of array
// Step 2. Find mid point
// Step 3. Compare if mid point is lower or higher than searched number
// Step 4. lop off unneeded side
// Step 5. go to step 1
//_________________________________________________END notes
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 44, 55];
function getMidPoint(arr, searchNumb) {
var length = arr.length;
var midPoint = Math.floor(length / 2);
var newArr = arr;
console.log(arr);
console.log("array midpoint value: " + arr[midPoint]);
if (arr[midPoint] > searchNumb) {
var newArr = arr.slice(0, arr[midPoint]);
return getMidPoint(newArr, searchNumb);
} else if (arr[midPoint] < searchNumb) {
var newArr = arr.slice(midPoint, arr.length);
return getMidPoint(newArr, searchNumb);
} else {
return arr
}
}
【问题讨论】:
-
你切错了。
-
顺便说一句,如果您避免使用局部变量(尽可能)并将局部状态作为参数传递,数据流将更加清晰(example)。
标签: javascript algorithm recursion binary-search