#include<iostream>
using namespace std;
int binary_search(int* data, int n, int key){
int low, high, mid;
low = 0;
high = n-1;
while (low <= high){
mid = low + (high - low) / 2;
if (key < data[mid])
high = mid - 1;
else if (key>data[mid])
low = mid + 1;
else
return mid;
}
return -1;
}
int interpolation_search(int* data, int n, int key){
int low, high, mid;
low = 0;
high = n - 1;
while (low <= high){
mid = low + (key - data[low]) / (data[high] - data[low])*(high - low);
if (key < data[mid])
high = mid - 1;
else if (key>data[mid])
low = mid + 1;
else
return mid;
}
return -1;
}
void fibonacci(int* f){
f[0] = 0;
f[1] = 1;
for (int i = 2; i < 20; i++)
f[i] = f[i - 1] + f[i - 2];
}
int fibonacci_search(int* data, int n, int key){
int low, high, mid, k;
low = 0;
high = n - 1;
k = 0;
int F[20];
fibonacci(F);
while (n > F[k] - 1)//计算n位于斐波那契数列的位置
k++;
int* temp = new int[F[k] - 1];
memcpy(temp, data, sizeof(int)*n);
for (int i = n; i < F[k] - 1; i++)//将不满的数值补全
temp[i] = data[n-1];
while (low <= high){
mid = low + F[k - 1] - 1;
if (key < temp[mid]){
high = mid - 1;
k = k - 1;
}
else if (key > temp[mid]){
low = mid + 1;
k = k - 2;
}
else
{
delete[] temp;
if (mid < n)
return mid;
else
return -1;
}
}
delete[] temp;
return -1;
}
int main(){
int nums[] = { 0,1,16,24,35,47,59,62,73,88,99 };
int len = sizeof(nums) / sizeof(int);
cout << binary_search(nums, len, 88) << endl;
cout << interpolation_search(nums, len, 88) << endl;
cout << fibonacci_search(nums, len, 88) << endl;
return 0;
}
【查找】二分查找、插值查找、斐波那契查找
最新推荐文章于 2022-08-05 21:53:13 发布