查找算法-插值查找、斐波那契查找

2020-02-06  本文已影响0人  Jorunk

3.插值查找

int search( int str[], int n, int key )
{
    int low, high, mid;
    
    low = 0;
    high = n-1;

    while( low <= high )
    {
        mid = low + (key-a[low]/a[high]-a[low])*(high-low); // 插值查找的唯一不同点
        
        if( str[mid] == key )
        {
            return mid;              
        }
        if( str[mid] < key )
        {
            low = mid + 1;       
        }
        if( str[mid] > key )
        {
            high = mid - 1;       
        }
    }

    return -1;                      
}

4.斐波那契查找

斐波那契查找的核心就是在mid前面的长度为F[k-1]-1,在mid的后面的长度为F[k-2]-1;

具体步骤:(记待查找的数组为a)

1:构建斐波那契数组;

2:找到n(a数组的长度)在斐波那契数组中的位置,并将数组补全(可用a(n-1)来补);

3:计算mid=low+F(k-1)-1;

4:如果a[mid]>key(key为要查找的数)high=mid-1;k=k-1;(mid前面的长度)

5:如果a[mid[<key low=mid+1;k=k-2(mid后面的长度);

6:如果a[mid]=key &&mid<=high 则返回下标值(即mid的值);否则查找失败;

#define MAXSIZE 20

void fibonacci(int *f)
{
   int i;

   f[0] = 1;
   f[1] = 1;
   
   for(i=2; i < MAXSIZE; ++i)
   {
       f[i] = f[i-2] + f[i-1];

   }
}
// n为数组a的长度
int fibonacci_search(int *a,int key,int n)
{
   int low = 0;
   int high = n - 1;
   int mid = 0;
   int k = 0;
   int F[MAXSIZE];
   int i;

   fibonacci(F);
   
   while( n > F[k]-1 ) 
   {
       ++k;
   }

   for( i=n; i < F[k]-1; ++i)
   {
       a[i] = a[high];
   }

   while( low <= high )
   {
       mid = low + F[k-1] - 1;

       if( a[mid] > key )
       {
           high = mid - 1;
           k = k - 1;
       }
       else if( a[mid] < key )
       {
           low = mid + 1;
           k = k - 2;
       }
       else
       {
           if( mid <= high ) 
           {
               return mid;
           }
           else
           {
               return high;
           }
       }
   }

   return -1;
}
上一篇 下一篇

猜你喜欢

热点阅读