您的位置:首页 > 其它

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

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;
}
一般情况下,插值查找的平均性能比二分查找,好了很多!
但如果数据分布不规范,不均匀,那还不如二分查找、
要灵活多变,根据要求选择最适合的查找方式!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐