插值查找是在折半查找的基础上进行了改进,所以这个方法是在有序表的基础上进行查找,主要应用于分布比较均匀的有序表,而对不均匀的表不适用。
其算法主要基于折半查找,对 mid 进行优化与调整。判断 key 值与 a[low] 和 a[high] 的大小关系,key 靠近哪个 mid 就偏向哪边。
原理:
算法代码:
#include <stdio.h>
#include <stdlib.h>
int binSearch(int a[], int n, int key);
int main()
{
int a[] = { 1,3,7,8,15,19,25,35,45,50 };
int index = binSearch(a, 10, 3);
if (index == -1)
printf("没找到");
else
printf("找到了,下标是%d", index);
return 0;
}
int binSearch(int a[], int n, int key)
{
int low = 0;
int high = n - 1;
int mid;
while (low <= high)
{
mid = low + (key - a[low]) / (a[high] - a[low])*(high - low);
if (a[mid] == key)
return mid;
else if (a[mid] < key)
low = mid + 1;
else
high = mid - 1;
}
return -1;
}