参考: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 - 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))