前几天要用到斐波那契查找,没找到能跑过的代码,现在分享下能跑通的代码
// 计算斐波那契数列中第n项的值
long long fibonacci(int n) {
if (n <= 1) {
return n;
}
else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
//斐波那契查找
int search4(int id) {
sort(vec.begin(), vec.end());
int n = vec.size();
int low = 0, high = n - 1;
int mid, i = 0, index = -1;
// 获取一个大于数组长度的最小斐波那契数
int F[50];
F[0] = 0;
F[1] = 1;
for (i = 2; i < 50; i++) {
F[i] = F[i - 1] + F[i - 2];
if (F[i] > high) {
break;
}
}
// 扩展数组以便应用斐波那契性质
int* temp = new int[F[i] + 1];
for (int j = 0; j < n; j++) {
temp[j] = vec[j];
}
for (int j = n; j < F[i]; j++) {
temp[j] = vec[n - 1];
}
while (low <= high) {
mid = low + F[i - 1] - 1;
if (temp[mid] > id) {
high = mid - 1;
i -= 2;
}
else if (temp[mid] < id) {
low = mid + 1;
i -= 1;
}
else {
// 检查是否是原数组中的元素
if (mid < n) {
index = mid;
break;
}
else {
high = mid - 1;
i -= 2;
}
}
}
if (index == -1 && temp[high] == id) {
index = high;
}
if (index >= n) {
index = -1;
}
delete[] temp;
temp = NULL;
return index;
}