查找(哨兵查找、二分查找、差值查找)

#include <iostream>

using namespace std;

#define N 10



int fib(int n)

{

    if(n == 0)

    {

        return 0;

    }

    else if(n == 1)

    {

        return 1;

    }

    else

    {

        return (fib(n-1) + fib(n-2));

    }

}



//普通查找:

int sequenctial_Search(int *a,int n,int key)

{

   int i;

   a[0] = key;

   i = n;

   while(a[i] != key)

   {

      i--;

   }

   return i;



}



//折半查找:

int Binary_Search(int *a,int n,int key)

{

   int low,high,mid;

   low = 0;

   high = n-1;

   while(low <= high)

   {

      mid = (int)(low + high)/2;

      if(key < a[mid])

      {

         high = mid-1;

      }

      else if(key > a[mid])

      {

         low = mid+1;

      }

      else

         return mid;

   }

   return 0;

}



//差值查找(斐波那契查找)

int Fib_Search(int *a,int n,int key)

{

    int low,high,mid,k;

    low = 0;

    k = 0;

    while(n > fib(k)-1)

    {

        k = k + 1;

    }

//    for(i = n;i < fib(k)-1;i++)

//    {

//        a[i] = -1;

//    }

    high = fib(k)-1;

//    cout << k<<endl;

    while(low <= high)

    {

        mid = low + fib(k-1)-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 -1;

        }

    }

    return 0;

}



int main()

{

   int a[N] = {1,2,4,5,6,8,9,10,20,31};

   int key,result;

   cout << "please input the key:";

   cin >> key;

   result = sequenctial_Search(a,N,key);

   cout<<result<<endl;



   result = Binary_Search(a,N,key);

   cout << result<<endl;



    result = Fib_Search(a,N,key);

   cout<<result<<endl;

   return 0;

}

  

你可能感兴趣的:(二分查找)