查找第二种:二分查找(折半查找)丶插值查找和斐波那契查找
2018-03-29 16:15
204 查看
//二分查找(折半查找)
int Bindary_Search(int *a, int n, int key) //第一版本
{
int low, high, mid;
low = 1;
high = n;
while (low <= high)
{
mid = low + (high - low) / 2; //折半 最重要!
if (a[mid] > key)
{
high = mid - 1;
}
else if(a[mid] < key)
{
low = mid + 1; //查找值壁中指大
}
else
{
return mid; //若相等,则找到了
}
}
return 0;
}
//脱胎于折半查找的 插值查找!!!!
//其实就是一句话的事情。。。
int Bindary_Search2(int *a, int n, int key) //优化版本
{
int low, high, mid;
low = 1;
high = n;
while (low <= high)
{
mid = low + (high - low)*(key - a[low]) / (a[high] - a[low]); //此处高能,请注意!!!!!
if (a[mid] > key)
{
high = mid - 1;
}
else if (a[mid] < key)
{
low = mid + 1; //查找值壁中指大
}
else
{
return mid; //若相等,则找到了
}
}
return 0;
}
斐波那契数列满足下面式子:
F【k】 = F【k - 1】 + F【k - 2】
这也是这个查找的精髓所在
//斐波那契数列查找
int Fibonacci_Search(int *a, int n, int key)
{
int F[10] = { 0,1,1,2,3,5,8,13,21,34 }; //要懂斐波那契数列,很很棒的一个数列
int low, mid, high, i, k;
low = 1;
high = n;
k = 0;
while (n > F[k] - 1)
{
k++; //记录n位于斐波那契数列中的位置
}
for (i = n; i <= F[k] - 1; i++)
{
a[i] = a
; //将空的补全
}
while (low <= high)
{
mid = low + F[k - 1] - 1; //记录当前的下标
//为什么是F[k - 1] - 1;
//F[K] - 1 = (F【K - 1】- 1) + (F【k - 2】 - 1) + 1
// 这句话理解了,也就对斐波那契查找理解了!!!总共有F[K] - 1数, 这个数前段为F[K - 1] - 1个, 中间还有一个舍去的mid, 后端为F[K - 2] - 1个!!!
if (key < a[mid])
{
high = mid - 1;
k = k - 1;
}
else if (key > a[mid])
{
low = mid + 1;
k = k - 2;
}
else
{
if (mid <= n)
{
return mid;
}
else
{
return n;
}
}
}
return 0;
}
一般情况下,插值查找的平均性能比二分查找,好了很多!
但如果数据分布不规范,不均匀,那还不如二分查找、
要灵活多变,根据要求选择最适合的查找方式!!!
int Bindary_Search(int *a, int n, int key) //第一版本
{
int low, high, mid;
low = 1;
high = n;
while (low <= high)
{
mid = low + (high - low) / 2; //折半 最重要!
if (a[mid] > key)
{
high = mid - 1;
}
else if(a[mid] < key)
{
low = mid + 1; //查找值壁中指大
}
else
{
return mid; //若相等,则找到了
}
}
return 0;
}
//脱胎于折半查找的 插值查找!!!!
//其实就是一句话的事情。。。
int Bindary_Search2(int *a, int n, int key) //优化版本
{
int low, high, mid;
low = 1;
high = n;
while (low <= high)
{
mid = low + (high - low)*(key - a[low]) / (a[high] - a[low]); //此处高能,请注意!!!!!
if (a[mid] > key)
{
high = mid - 1;
}
else if (a[mid] < key)
{
low = mid + 1; //查找值壁中指大
}
else
{
return mid; //若相等,则找到了
}
}
return 0;
}
斐波那契数列满足下面式子:
F【k】 = F【k - 1】 + F【k - 2】
这也是这个查找的精髓所在
//斐波那契数列查找
int Fibonacci_Search(int *a, int n, int key)
{
int F[10] = { 0,1,1,2,3,5,8,13,21,34 }; //要懂斐波那契数列,很很棒的一个数列
int low, mid, high, i, k;
low = 1;
high = n;
k = 0;
while (n > F[k] - 1)
{
k++; //记录n位于斐波那契数列中的位置
}
for (i = n; i <= F[k] - 1; i++)
{
a[i] = a
; //将空的补全
}
while (low <= high)
{
mid = low + F[k - 1] - 1; //记录当前的下标
//为什么是F[k - 1] - 1;
//F[K] - 1 = (F【K - 1】- 1) + (F【k - 2】 - 1) + 1
// 这句话理解了,也就对斐波那契查找理解了!!!总共有F[K] - 1数, 这个数前段为F[K - 1] - 1个, 中间还有一个舍去的mid, 后端为F[K - 2] - 1个!!!
if (key < a[mid])
{
high = mid - 1;
k = k - 1;
}
else if (key > a[mid])
{
low = mid + 1;
k = k - 2;
}
else
{
if (mid <= n)
{
return mid;
}
else
{
return n;
}
}
}
return 0;
}
一般情况下,插值查找的平均性能比二分查找,好了很多!
但如果数据分布不规范,不均匀,那还不如二分查找、
要灵活多变,根据要求选择最适合的查找方式!!!
相关文章推荐
- 数据结构之查找——折半查找、插值查找、斐波那契查找
- 折半查找、插值查找和斐波那契查找
- 静态查找(顺序查找,折半查找,插值查找,斐波那契查找)
- 简单查找算法之折半查找、插值查找、斐波那契查找
- 折半查找、插值查找以及斐波那契查找
- 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组
- 查找(顺序、二分、斐波那契和插值)算法的实现和测试
- 二分查找及插值查找
- 查找算法之插值查找、斐波那契查找
- “斐波那契查找”真的比“二分查找”快么?
- 顺序查找:二分查找,斐波那契查找,插值查找
- 有序向量:二分查找&斐波那契查找&插值查找
- 看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)
- 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组
- 数据结构与算法13:折半查找、差值查找和斐波那契查找
- 采用二分查找(即折半查找)的方法实现查找
- "二分查找(Binary Search)"与"斐波那契查找(Fibonacci Search)"
- 数据结构基础之折半查找与插值查找
- 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找(Swift版)
- 斐波那契查找(黄金分割法查找)(仅使用加减实现的二分查找)