插值查找
基本思想
插值查找算法的也是一种基于有序列表的查找算法,思想上与二分查找法相似,不同的是每次折中选取的时候,变成“自适应”式的了。
图解示例
编码提要
编码的过程中,只需将mid的获取方式,在二分查找的基础上,按照公式做出修改就好。
java语言的编程实现
package com.cc.searchcollection;
/**
* @Classname Code_03_InsertValueSearch
* @Description TODO
* @Date 2020/3/3 20:34
* @Created by dreamBreathing
*/
public class Code_03_InsertValueSearch {
public static void main(String[] args) {
int[] arr = {1, 4, 12, 17, 32, 56};
int resultIndex = insertValueSearch(arr, 0, arr.length - 1, 12);
System.out.println("resultIndex = " + resultIndex);
}
public static int insertValueSearch(int[] arr, int left, int right, int targetValue) {
if (left > right || targetValue < arr[0] || targetValue > arr[arr.length - 1]) {
return -1;
}
//求出自适应的mid
int mid = left + (right - left) * (targetValue - arr[left]) / (arr[right] - arr[left]);
int midValue = arr[mid];
if (targetValue > arr[mid]) {//向右开始递归
return insertValueSearch(arr, mid + 1, right, targetValue);
} else if (targetValue < arr[mid]) {
return insertValueSearch(arr, left, mid - 1, targetValue);
} else {
return mid;
}
}
}
python语言的编程实现
# -- coding: utf-8 --
# @Time : 2020/3/10 20:08
# @Author : dreamBreathing
# @File : insertValueSearch.py
# @Software: PyCharm
def insert_value_search(tag_list, left, right, target):
if left > right:
return -1
mid = left + (right - left) * (target - tag_list[left]) \
//(tag_list[right] - tag_list[left])
mid_value = tag_list[mid]
if target > mid_value:
return insert_value_search(tag_list, mid + 1, right, target)
elif target < mid_value:
return insert_value_search(tag_list, left, mid - 1, target)
else:
return mid
if __name__ == "__main__":
list1 = [1, 3, 5, 7, 9, 12]
result_index = insert_value_search(list1, 0, len(list1) - 1, 7)
if result_index != -1:
print("找到啦,下标为" + str(result_index))
else:
print("数组中没有目标元素")