[数据结构]程杰——静态查找_Search

#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100 /* 存储空间初始分配量 */

typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */

int F[100]; /* 斐波那契数列 */

/* 无哨兵顺序查找,a为数组,n为要查找的数组个数,key为要查找的关键字 */
int Sequential_Search(int *a,int n,int key)
{
    int i;
    for(i=1;i<=n;i++)
    {
        if (a[i]==key)
            return i;
    }
    return 0;
}
/* 有哨兵顺序查找 */
/*
它的主要作用是:在查找循环中"监视"下标变量j是否越界。一旦越界(即j=0),因为R[0].key和自己比较,循环判定条件。
不成立使得查找循环结束,从而避免了在该循环内的每一次均要检测j是否越界(即省略了循环判定条件"j>=1")。
*/
int Sequential_Search2(int *a,int n,int key)
{
    int i;
    a[0]=key;
    i=n;
    while(a[i]!=key)
    {
        i--;
    }
    return i;
}


/* 折半查找 */
//要求:待查找的序列是有序的
//当key<a[mid]的时候,high=mid-1的原因是进一步缩小关键字可能存在的区域
//当key>a[mid]的时候,low=mid+1的原因是进一步缩小关键字可能存在的区域

int Binary_Search(int *a,int n,int key)
{
    int low,high,mid;
    low=1;  /* 定义最低下标为记录首位 */
    high=n; /* 定义最高下标为记录末位 */
    while(low<=high)
    {
        mid=(low+high)/2;   /* 折半 */
        if (key<a[mid])     /* 若查找值比中值小 */
            high=mid-1;     /* 最高下标调整到中位下标小一位 */
        else if (key>a[mid])/* 若查找值比中值大 */
            low=mid+1;      /* 最低下标调整到中位下标大一位 */
        else
    	{
            return mid;     /* 若相等则说明mid即为查找到的位置 */
    	}

    }
    return 0;
}

/* 插值查找 */
int Interpolation_Search(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 (key<a[mid])     /* 若查找值比插值小 */
            high=mid-1;     /* 最高下标调整到插值下标小一位 */
        else if (key>a[mid])/* 若查找值比插值大 */
            low=mid+1;      /* 最低下标调整到插值下标大一位 */
        else
            return mid;     /* 若相等则说明mid即为查找到的位置 */
    }
    return 0;
}

/* 斐波那契查找 */
int Fibonacci_Search(int *a,int n,int key)
{
    int low,high,mid,i,k=0;
    low=1;  /* 定义最低下标为记录首位 */
    high=n; /* 定义最高下标为记录末位 */
    while(n>F[k]-1)
        k++;
    for (i=n;i<F[k]-1;i++)
        a[i]=a[n];

    while(low<=high)
    {
        mid=low+F[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;     /* 若相等则说明mid即为查找到的位置 */
        	else
                return n;
    	}

    }
    return 0;
}






int main(void)
{

    int i,result;
    int arr[MAXSIZE]={0,1,16,24,35,47,59,62,73,88,99};

    result=Sequential_Search(arr,10,62);
    printf("Sequential_Search:%d \n",result);
    result=Sequential_Search2(arr,10,62);
    printf("Sequential_Search2:%d \n",result);

    result=Binary_Search(arr,10,62);
    printf("Binary_Search:%d \n",result);


    result=Interpolation_Search(arr,10,62);
    printf("Interpolation_Search:%d \n",result);


    F[0]=0;
    F[1]=1;
    for(i = 2;i < 100;i++)
    {
        F[i] = F[i-1] + F[i-2];
    }
    result=Fibonacci_Search(arr,10,62);
    printf("Fibonacci_Search:%d \n",result);

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值