我正在尝试实现一个递归二进制搜索算法,该算法需要4个参数,一个列表,第一个,排序子序列中第一个项的整数索引,last,排序子中最后一个项的整数索引-sequence和一个目标,它将与列表中存储的值进行比较。
算法需要返回已排序子序列中目标的位置(如果存在),如果不返回它应放置在已排序子序列中的位置。
这是我到目前为止所拥有的;
def binary_search(a_list, first, last, target):
subMidpoint = (first + last) // 2
if a_list[subMidpoint] == target:
return subMidpoint
else:
if target < a_list[subMidpoint]:
last = subMidpoint -1
return binarySearch(a_list, first, last, target)
else:
first = subMidpoint +1
return binarySearch(a_list, first, last, target)
return first
如果项目不存在,我正在努力绕过它将如何返回位置,任何帮助将不胜感激。目前编写的代码正在返回&#39;无&#39;而不是指数位置。
非常感谢提前。
编辑;
感谢大家的帮助,我设法改变了最后一个条款并且已经通过了一些测试,但是当目标小于第一个中的最小值并且目标更大时它失败了比 last 中的值。
这是改变后的最终条款。
else:
if target < a_list[subMidpoint]:
last = subMidpoint -1
return binary_search(a_list, first, last, target)
else:
first = subMidpoint +1
return first
答案 0 :(得分:0)
你的描述中几乎有你的答案:如果你到达相邻的物品,说5号和6号位置,并且你没有找到该物品,那么它将被插入到这两个物品之间。由于列表索引增长到高端,在这种情况下,您将返回两者中的较高者 - 6
。
因此,你的逻辑将出现在你的最后一句
中else:
if subMidpoint == first:
return last
else:
first = subMidpoint +1
return binarySearch(a_list, first, last, target)
return first
放在底部;你应该不能够达到那个声明。elif
关键字;你的程序将更具可读性。答案 1 :(得分:0)
解决了,谢谢大家。不是最干净的解决方案,但它有效。
def binary_search(a_list, first, last, target):
subMidpoint = (first + last) // 2
if target < a_list[first]:
return first
elif target > a_list[last]:
return last +1
elif a_list[subMidpoint] == target:
return subMidpoint
elif target < a_list[subMidpoint]:
last = subMidpoint -1
return binary_search(a_list, first, last, target)
else:
first = subMidpoint +1
return first