这是一个常见的在互联网上找到的Interpolation Search算法的C/C++实现。然而,当与一组大约100000个整数的排序数组一起使用时,mid变量开始生成负数组索引,导致分段错误。问题可能是什么?
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int interpolationSearch(int sortedArray[], int toFind, int len) {
// Returns index of toFind in sortedArray, or -1 if not found
int low = 0;
int high = len - 1;
int mid;
while (sortedArray[low] <= toFind && sortedArray[high] >= toFind) {
mid = low + ((toFind - sortedArray[low]) * (high - low)) /
(sortedArray[high] - sortedArray[low]);
if (sortedArray[mid] < toFind) {
low = mid + 1;
} else if (sortedArray[mid] > toFind) {
high = mid - 1;
} else {
return mid;
}
}
if (sortedArray[low] == toFind)
return low;
else
return -1; // Not found
}
int main(void) {
srand(time(0));
int arr[100000];
for (int i=0; i<100000; i++) {
arr[i] = rand()%100000;
}
int length = sizeof(arr)/sizeof(int);
qsort(arr,length,sizeof(int),order);
for (int j=0; j<10000; j++) {
interpolationSearch(arr,rand()%100000,length);
}
}
100000
,第一个元素的值为1
。假设我们正在寻找值为99999
的元素。那么在第一次运行时,这个乘积将产生9999800001,这对于32位整数来说太大了。 - Björn Pollex(high-low)*(toFind-sortedArray[low])
可能会变得非常大。每个元素都可以是16位,因此乘积可能是32位并且溢出。 - kriss