已排序子列表的递归二进制搜索

时间:2018-04-04 14:24:00

标签: python algorithm recursion binary-search

我正在尝试实现一个递归二进制搜索算法,该算法需要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

2 个答案:

答案 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