使用字符串进行二进制搜索的输出不正确

时间:2018-01-21 17:19:41

标签: python

我有一个典型的二进制搜索算法实现:

maps

测试数据如下:

def binarySearch(arr, element):
    first = 0
    last = len(arr) - 1
    while first <= last:
        i = (first + last) // 2
        if arr[i] == element:
            return 'Found at position: {}'.format(i)
        elif arr[i] > element:
            last = i - 1
        elif arr[i] < element:
            first = i + 1

当我按如下方式调用arr = ['0006', '000e', '000f', '0023', '002a', '002E1627', '0032A542', '0037'] 函数时:

binarySearch()

我得到的输出为:

element = '002E1627'
print (binarySearch(arr, element))

但是,请输入以下内容:

Found at position: 5

我得到的输出为:

element = '002a'
print (binarySearch(arr, element))

此输出背后的原因是什么?

第二种情况的预期输出是:None

2 个答案:

答案 0 :(得分:1)

问题是二进制搜索仅适用于已排序的数组/列表。

由于角色a位于角色E之后(小写总是在大写字母之后),因此您的列表根本不会被排序。

列表应为:

arr = ['0006', '000e', '000f', '0023', '002E1627', '002a', '0032A542', '0037']

然后您将获得所需的输出

答案 1 :(得分:1)

只需转换为单个案例:

def binarySearch(arr, element):
    first = 0
    last = len(arr) - 1
    while first <= last:
        i = (first + last) // 2
        if arr[i].upper() == element.upper():
            return 'Found at position: {}'.format(i)
        elif arr[i].upper() > element.upper():
            last = i - 1
        elif arr[i].upper() < element.upper():
            first = i + 1

element = '002a'
print (binarySearch(arr, element))

Found at position: 4
相关问题