思路
-
概述
变换一下,插值查找求的mid_index为:
mid_index = left+(right-left) * ( val-array[left] ) / ( array[right]-array[left] ) -
举例说明
Python实现
# 要求数组是有序的
def insert_value_search(array, left, right, val):
if left > right or val < array[0] or array[right-1] < val: # 注意后半部分的判断条件
return -1
mid_index = left + (right - left) * (val - array[left]) // (array[right] - array[left])
mid_val = array[mid_index]
if mid_val < val:
return insert_value_search(array, mid_index + 1, right, val)
elif val < mid_val:
return insert_value_search(array, left, mid_index - 1, val)
else:
return mid_index
if __name__ == '__main__':
li=[]
for i in range(100):
li.append(i+1)
print(insert_value_search(li, 0, len(li) - 1, 3))
插值查找和二分查找比较
def binary_search(array, left, right, val):
print("二分查找被调用")
if left > right:
return []
mid_index = (left + right) >> 1
if val < array[mid_index]:
return binary_search(array, left, mid_index - 1, val)
elif array[mid_index] < val:
return binary_search(array, mid_index + 1, right, val)
else:
res_list = []
temp = mid_index - 1
while True:
if temp < 0 or array[temp] != array[mid_index]:
break
res_list.append(temp)
temp -= 1
temp = mid_index + 1
res_list.append(mid_index)
while True:
if temp > len(array) - 1 or array[temp] != array[mid_index]:
break
res_list.append(temp)
temp += 1
return res_list
def insert_value_search(array, left, right, val):
print("插值查找被调用")
if left > right or val < array[0] or array[right - 1] < val:
return -1
mid_index = left + (right - left) * (val - array[left]) // (array[right] - array[left])
mid_val = array[mid_index]
if mid_val < val:
return insert_value_search(array, mid_index + 1, right, val)
elif val < mid_val:
return insert_value_search(array, left, mid_index - 1, val)
else:
return mid_index
if __name__ == '__main__':
li = []
for i in range(100):
li.append(i + 1)
print(insert_value_search(li, 0, len(li) - 1, 55))
print(binary_search(li, 0, len(li) - 1, 55))
'''
插值查找被调用
54
二分查找被调用
二分查找被调用
二分查找被调用
二分查找被调用
二分查找被调用
二分查找被调用
二分查找被调用
[54]
'''
- 总结: