查找第二种:二分查找(折半查找)丶插值查找和斐波那契查找

这篇博客介绍了查找算法中三种不同的方法:二分查找、插值查找和斐波那契查找。插值查找是对二分查找的一种改进,其在数据分布均匀的情况下性能更优,而斐波那契查找利用斐波那契数列的特性进行查找。文章强调根据数据特性和需求选择合适的查找策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//二分查找(折半查找)
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[n];            //将空的补全
}
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;
}

一般情况下,插值查找的平均性能比二分查找,好了很多!

但如果数据分布不规范,不均匀,那还不如二分查找、

要灵活多变,根据要求选择最适合的查找方式!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值