查找——靜態查找_插值查找

假如要在集合[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;
}