/*
mid = low + (key-data[low])*(high - low)/(data[high] - data[low])
*/
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
int Interpolation_Search(int* data, int val) {
int low, mid, high,temp;
low = 0;
high = 49;
printf("正在查找.....\n");
while (low <= high && val != -1) {
if (low == high) {
mid = low;
}
else {
temp = (val - data[low]) * (high - low) / (data[high] - data[low]);
mid = low + temp;
}
Sleep(100);
printf("%d\n", mid);
if (val == data[mid]) {
return mid;
}
else if (val < data[mid]) {
high = mid - 1;
}
else {
low = mid + 1;
}
}
return -1;
}
int main() {
int i, j, val = 1, num, data[50] = { 0 };
for (i = 0; i < 50;i++) {
data[i] = val;
val = val + rand() % 5 + 1;
}
for (i = 0; i < 5; i++) {
for (j = 0; j < 10; j++) {
printf("%3d-%-3d", i * 10 + j + 1, data[i * 10 + j]);
}
printf("\n");
}
while (1) {
num = 0;
printf("请输入要查找的键值 : ");
scanf_s("%d",&val);
if (val == -1) {
break;
}
num = Interpolation_Search(data,val);
if (num == -1) {
printf("####没找到[%3d]####\n",val);
break;
}
else {
printf("在第%2d个位置找到了[%3d]\n",num+1,data[num]);
break;
}
}
printf("所有数据为:\n");
for (i = 0; i < 5;i++) {
for (j = 0; j < 10; j++) {
printf("%3d-%-3d",i*10+j+1,data[i*10+j]);
}
printf("\n");
}
return 0;
}
/*
优点:查找效率高
缺陷:取相邻数据中间数时,mid可能会维持一个点不变,导致无限循环