具有(log n)时间复杂度的二进制搜索功能

时间:2015-03-19 06:20:38

标签: python

例如,

print(binary_search(7, [1, 5, 10])) # 2 
print(binary_search(42, (-5, 1, 3, 5, 7, 10))) # 6

我的代码:

def binary_search(x, seq):
    if len(seq) == 0
    low = 0
    high = len(seq)
    mid = (low+high)//2
    if x == seq[mid]:
       return mid
    elif x < seq[mid]:
         return binary_search(x,seq[:mid])
    elif x > seq[mid]:
         return mid + 1 + binary_search(x,seq[mid+1:]

1 个答案:

答案 0 :(得分:4)

并不多,你错过了第二行的冒号和回复声明以及最后一行的结束声明:

def binary_search(x, seq):
    if len(seq) == 0: return 0
    low = 0
    high = len(seq)
    mid = (low+high)//2
    if x == seq[mid]:
        return mid
    elif x < seq[mid]:
        return binary_search(x,seq[:mid])
    elif x > seq[mid]:
        return mid + 1 + binary_search(x,seq[mid+1:])

print(binary_search(7, [1, 5, 10]))  # 2
print(binary_search(42, (-5, 1, 3, 5, 7, 10)))  # 6

值得注意的是,内置了这个:bisect.bisect_left()

  

返回值适合用作list.insert()的第一个参数,假设a已经排序。

参数的顺序恰恰相反:

import bisect
print(bisect.bisect_left([1, 5, 10], 7))  # 2
print(bisect.bisect_left((-5, 1, 3, 5, 7, 10), 42))  # 6