二分查找每次都是从中间开始,没有考虑数据之间的关系,这是一种比较低效的实现方法,插值查找就是在二分查找的基础上,改进的中间记录的选取。
虽然插值查找的时间复杂度月二分查找相同,都是 O(logn),但是对于表比较大,而关键字分布比较均匀的查找,插值算法的平均性能比折半查找要好很多。反之,线性表中记录分布不均匀,用插值查找未必是很好的选择。
C 版
// interpolation search c.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
int interpolation_search(int* arr, int length, int target)
{
int first = 0 ;
int last = length - 1 ;
while (first <= last)
{
int mid = first + 1 + (target - arr[first]) * (last - first) / (arr[last] - arr[first]);
if (arr[mid] < target)
{
first = mid ;
}
else if (arr[mid] > target)
{
last = mid ;
}
else
{
return mid ;
}
}
return 0 ;
}
int _tmain(int argc, _TCHAR* argv[])
{
int arr[] = {0, 1, 16, 24, 35, 47, 59, 62, 73, 88, 99};
int length = 11 ;
int result = interpolation_search(arr, length, 16);
return 0;
}
C++ 版
// interpolation sea