python二分查找和插值查找

参考:www.bilibili.com/video/BV1E4…

实现

tempList = [x for x in range(10)]
tempList.insert(5, 5)
tempList.insert(5, 5)
tempList.insert(5, 5)


# 二分查找的前提是排好序的列表
def binarySearch(arr, left, right, searchValue):
    if left > right:
        return -1
    mid = (left + right) // 2
    if searchValue == arr[mid]:
        return mid
    elif searchValue > arr[mid]:
        return binarySearch(arr, mid + 1, right, searchValue)
    elif searchValue < arr[mid]:
        return binarySearch(arr, left, mid - 1, searchValue)


def binarySearch2(arr, left, right, searchValue):
    print("~~~")
    result = []
    if left > right:
        return -1
    mid = (left + right) // 2
    if searchValue == arr[mid]:
        result.append(mid)

        temp = mid
        while True:
            # 边界
            if mid - 1 >= 0 and arr[mid - 1] == searchValue:
                result.append(mid - 1)
                mid -= 1
            else:
                break
        # 还原
        mid = temp
        while True:
            # 边界
            if mid + 1 <= len(arr) - 1 and arr[mid + 1] == searchValue:
                result.append(mid + 1)
                mid += 1
            else:
                break
        return result
    elif searchValue > arr[mid]:
        return binarySearch2(arr, mid + 1, right, searchValue)
    elif searchValue < arr[mid]:
        return binarySearch2(arr, left, mid - 1, searchValue)

# 插值查找
def binarySearch3(arr, left, right, searchValue):
    print("~~~~")
    result = []
    if left > right:
        return -1
    # mid = (left + right) // 2
    mid = left + (right - left) * (searchValue - arr[left]) // (arr[right] - arr[left])
    if searchValue == arr[mid]:
        result.append(mid)

        temp = mid
        while True:
            # 边界
            if mid - 1 >= 0 and arr[mid - 1] == searchValue:
                result.append(mid - 1)
                mid -= 1
            else:
                break
        # 还原
        mid = temp
        while True:
            # 边界
            if mid + 1 <= len(arr) - 1 and arr[mid + 1] == searchValue:
                result.append(mid + 1)
                mid += 1
            else:
                break
        return result
    elif searchValue > arr[mid]:
        return binarySearch2(arr, mid + 1, right, searchValue)
    elif searchValue < arr[mid]:
        return binarySearch2(arr, left, mid - 1, searchValue)


print(tempList)
print(binarySearch2(tempList, 0, len(tempList) - 1, 1))
print(binarySearch3(tempList, 0, len(tempList) - 1, 1))