Python排序和二进制搜索IndexError:列表索引超出范围

时间:2017-05-11 01:06:41

标签: python indexing

我很难理解这段代码中的错误:

def arr_sort_binsearch(ar):

        ar.sort()

        first = 0
        last = len(ar)-1
        found = False
        item = 8

        for num in ar: 
            while first<=last and not found:
                midpoint = (first + last)//2
                if ar[midpoint] + num == item:
                    found = True
                else:
                    if item < ar[midpoint]:
                        last = midpoint-1
                    else:
                        first = midpoint+1
            print("{} and {} is: {}".format(num, ar[num], item))

ar = [1,3,5,7]
arr_sort_binsearch(ar)

我得到一个异常,说我的索引超出了范围。我理解索引溢出的理论仅仅是我在代码中找不到它。

2 个答案:

答案 0 :(得分:2)

错误在于我认为这句话:

print("{} and {} is: {}".format(num, ar[num], item))

num不应该是ar

中的参数

欢呼声

答案 1 :(得分:1)

如果您尝试编写二进制搜索,则代码不正确。

1,回答你的问题,为什么IndexError: list index out of range

将输入列表ar上的代码循环为num,最后print,该元素将成为ar[num]的索引,这会引发错误,例如:

你有ar=[1,2,3,4,5,8,9,11,6],当循环到9时,print尝试使用ar[9],但列表ar中只有9个元素,超过最大索引8,这将提升IndexError: list index out of range

2,您的二进制搜索可以像这样修改:

def arr_sort_binsearch(ar,item):

    ar.sort()

    first = 0
    last = len(ar)-1
    found = False

    while first<=last and not found:
        midpoint = (first + last)//2
        if ar[midpoint] == item:
            found = True
        else:
            if item < ar[midpoint]:
                last = midpoint-1
            else:
                first = midpoint+1
    return found

如果你调用函数,这将返回True或False:

arr_sort_binsearch([1,2,3,4,5,8,9,11,6],12)返回错误

arr_sort_binsearch([1,2,3,4,5,8,9,11,6],8)返回True