二分查找的关键是中心项左侧的所有项都小于中心项,而右侧的所有项都大于中心项。另一个关键是列表的任何给定部分本身都表现为排序列表,因此该属性仍然适用。所以你不断地把列表分成两半,直到你找到你的元素。这通常通过递归来完成,以空列表作为元素不存在于列表中的基本情况。
这里有一些伪代码可以帮助您入门:
find (list, start, end, target) {
if (start > end) // this is called a base case, look into recursion
return -1
center = (end - start) / 2
if list[center] == target // this is also a base case
return center;
else if list[center] > target
return find(list, start, center-1, target)
else
return find(list, center+1, end, target)
}
我们会像这样运行它:
list = [ 1 , 3, 7, 9, 12, 15, 17, 21, 28 ]
// need to find the target in the list
find(list, 0, list.length - 1, 3);
这将首先查看 12,它比我们的目标大,然后它将列表分成两半,查看较小一半的中间 3 并找到它,并返回它的索引。它在越来越大的列表上往往更有益。
我说它使用递归,这意味着两件事:它会调用自己,直到找到答案,当它找到答案时,它会停止调用自己。您稍后可能会发现两种主要的递归,但最重要的部分是这两个:递归步骤(调用自身)和基本情况(当它停止调用自身时)。没有这两个部分,某些东西就不是递归的。