插补法查找(InterpolationSearch)

来源:互联网 发布:java中方法是什么 编辑:程序博客网 时间:2024/06/07 11:53
说明
如果待查找的数据分布平均的话,可以使用插补(Interpolation)法查找,在搜寻的对象大于500时,插补法查找会比二分法查找来的快速。

方法
插补法查找是以数据分布的近似直线来作比例运算,以求出中间的索引并进行数据比对,如果取出的值小于要寻找的值,则提高下界,如果取出的值大于要寻找的值,则降低下界,如此不断的减少搜寻的范围,所以其本原则与二分法查找是相同的,至于中间值的寻找是透过比例运算,如下所示,其中K是指定要寻找的对象,而m则是可能的索引值:



C代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX 10 #define SWAP(x,y) {int t; t = x; x = y; y = t;} void quickSort(int[], int, int); int interpolationSearch(int[], int); int main(void) { srand(time(NULL)); int number[MAX] = {0}; int i;for(i = 0; i < MAX; i++) { number[i] = rand() % 100; } quickSort(number, 0, MAX-1); printf("数列:"); for(i = 0; i < MAX; i++) printf("%d ", number[i]); int find;printf("\n输入寻找对象:"); scanf("%d", &find); if((i = interpolationSearch(number, find)) >= 0) printf("找到数字于索引:%d ", i); else printf("\n找不到指定数"); printf("\n"); return 0; } int interpolationSearch(int number[], int find) { int low = 0; int upper = MAX - 1; while(low <= upper) { int mid = (upper-low)* (find-number[low])/(number[upper]-number[low]) + low; if(mid < low || mid > upper) break; if(find < number[mid]) upper = mid - 1; else if(find > number[mid]) low = mid + 1; else return mid; } return -1;} void quickSort(int number[], int left, int right) { if(left < right) { int s = number[(left+right)/2]; int i = left - 1; int j = right + 1; while(1) { while(number[++i] < s) ;  //向右找 while(number[--j] > s) ;  //向左找 if(i >= j) break; SWAP(number[i], number[j]); } quickSort(number, left, i-1);   //对左边进行递归quickSort(number, j+1, right);  //对右边进行递归} } 

转载自:http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/InterpolationSearch.htm

原创粉丝点击