插补查找算法又称为插值查找,它是折半查找算法的改进版。插补算法是按照数据的分布,利用公式预测键值所在的位置,快速缩小键值所在序列的范围,慢慢逼近,直到查找到数据为止。由此可以看出,插补查找算法比折半查找算法的取值范围更小,因此它的速度要比折半法查找快,这就是插补查找算法的优点。
键值的索引计算公式:
middle = left + (target-data[left])/(data[right]-data[left])*(right-left)
用户可以随意输入一组数据,例如输入一组数据:34、53、57、68、72、81、89、93、99。在这组数据中用插补查找法分别查找数据 57、53、93、89、100,显示每次查找的过程。
def insret_seach(data,num): # 自定义插补查找函数
low=0 # 定义变量表示最低位
high=8 # 义变量表示最高位
print("正在查找......")
while low<=high and num!=-1: # 循环判断低位小于等于高位且键值不等于-1
mid=low+int((num-data[low])*(high-low)/(data[high]-data[low])) # 用插补查找核心 计算出边界位置
if num==data[mid]: # 如果键值等于边界值
return mid # 返回边界位置
elif num<data[mid]: # 如果键值小于边界值
print('%c介于位置%d[%c]和边界值%d[%c]之间,找左半边'%(num,low+1,data[low],mid+1,data[mid])) # 输出在左半边查找
high=mid-1 # 最高位等于边界位置减1
elif num>data[mid]: # 如果键值大于边界值
print('%c介于边界值位置%d[%c]和%d[%c]之间,找右半边'%(num,mid+1,data[mid],high+1,data[high])) # 输出在右半边查找
low=mid+1 # 最低位等于边界位置加1
return -1 # 自定义函数到此结束
data = [34,53,57,68,72,81,89,93,99] # 定义数列
print("数据内容是:")
for i in range(9): # 遍历行
# 遍历列
print(' %d[%d]' % (i+1,data[i]),end='') # 输出数列
print()
while True: # 循环查找
number = 0 # 定义变量用来存储查找结果
num = int(input("请输入查找键值,输入-1退出程序:"))
if num == -1: # 判断键值是否是-1
break # 若为-1,跳出循环
number = insret_seach(data, num) # 调用自定义的查找函数——search()函数
if number == -1: # 判断查找结果是否是-1
print('没有找到[%d]' % num)
else:
print('在%d个位置找到[%d]' % (number + 1, data[number])) # 若不为-1,提示查找位置