假如要在集合[1,100](分佈不必定均勻)中查找10,咱們下意識中確定是看靠前的部分,而不是先看中間的部分。查單詞也相似,若是在字典中查找「apple」,咱們通常都是先翻到字典相對靠前的部分比對,而不是一開始就翻到正中間去比對,這就是插值查找的來源。app
插值查找在增加均勻的元素序列中效率最高(比折半查找高),在增加差別大的元素序列中效率最差(比折半查找低)。spa
二分查找中查找點計算以下:mid=(low+high)/2, 即mid=low+1/2*(high-low);code
類比下,對於插值查找,咱們能夠將查找的點改進爲以下:mid=low+(key-a[low])/(a[high]-a[low])*(high-low),也就是將上述的比例參數1/2改進爲自適應的,根據關鍵字在整個有序表中所處的位置,讓mid值的變化更靠近關鍵字key,這樣也就間接地減小了比較次數。blog
#include<stdio.h> #include<stdlib.h> #define MAXSIZE 100 int InsertionSearch(int *a,int n,int key){ int low,high,mid; low=0; high=n-1; while(low<=high){ mid=low+(key-a[low])/(a[high]-a[low])*(high-low); if(key<a[mid]){ high=mid-1; }else if(key>a[mid]){ low=mid+1; }else{ return mid; } } return -1; } int main(){ int a[MAXSIZE]; for(int i=0;i<6;i++){ scanf("%d",&a[i]); } printf("3所在的位序爲:%d\n",InsertionSearch(a,6,3)); return 0; }